可以通過(guò)中斷 和 共享變量的方式實(shí)現(xiàn)線程間的通訊和協(xié)作
比如說(shuō)最經(jīng)典的生產(chǎn)者-消費(fèi)者模型:當(dāng)隊(duì)列滿時(shí),生產(chǎn)者需要等待隊(duì)列有空間才能繼續(xù)往里面放入商品,而在等待的期間內(nèi),生產(chǎn)者必須釋放對(duì)臨界資源(即隊(duì)列)的占用權(quán)。因?yàn)樯a(chǎn)者如果不釋放對(duì)臨界資源的占用權(quán),那么消費(fèi)者就無(wú)法消費(fèi)隊(duì)列中的商品,就不會(huì)讓隊(duì)列有空間,那么生產(chǎn)者就會(huì)一直無(wú)限等待下去。因此,一般情況下,當(dāng)隊(duì)列滿時(shí),會(huì)讓生產(chǎn)者交出對(duì)臨界資源的占用權(quán),并進(jìn)入掛起狀態(tài)。然后等待消費(fèi)者消費(fèi)了商品,然后消費(fèi)者通知生產(chǎn)者隊(duì)列有空間了。同樣地,當(dāng)隊(duì)列空時(shí),消費(fèi)者也必須等待,等待生產(chǎn)者通知它隊(duì)列中有商品了。這種互相通信的過(guò)程就是線程間的協(xié)作。
Java中線程通信協(xié)作的最常見方式:
1. syncrhoized加鎖的線程的Object類的wait()/notify()/notifyAll()
2. ReentrantLock類加鎖的線程的Condition類的await()/signal()/signalAll()
線程間直接的數(shù)據(jù)交換:
3. 通過(guò)管道進(jìn)行線程間通信:字節(jié)流、字符流