引子:
大家上過操作系統(tǒng)的都知道“生產(chǎn)者-消費(fèi)者(Producer-Consumer)”模型,主要討論的是進(jìn)程(線程)間的互斥和同步問題,關(guān)鍵是對鎖(lock)的申請、獨(dú)占和釋放,在這里我就不羅嗦了。原先我寫的Java代碼如下:


















































































































































雖然Java對信號(hào)量及原語做了更高層次的封裝(wait()、notify()、notifyAll()、synchronized{}),但看完上述代碼還是覺得有點(diǎn)麻煩,于是JDK 5在原先collection框架的基礎(chǔ)上增加了java.util.concurrent包,封裝了許多用于線程并發(fā)操作的數(shù)據(jù)結(jié)構(gòu)和操作。其中的BlockingQueue接口就是封裝了一個(gè)阻塞隊(duì)列的接口,具體地說就是實(shí)現(xiàn)了一個(gè)用于消費(fèi)者(多個(gè))和生產(chǎn)者(多個(gè))交換產(chǎn)品的中介,生產(chǎn)者線程在隊(duì)列滿時(shí)阻塞,消費(fèi)者線程在隊(duì)列空時(shí)阻塞,當(dāng)然在沒有得到鎖之前兩類線程均會(huì)阻塞。詳細(xì)信息可以參考Java Doc。下面用BlockingQueue實(shí)現(xiàn)P-C模型:








































































可以看出代碼中沒有出現(xiàn)wait()或notify()之類的原語操作,這些操作由concurrent框架負(fù)責(zé)封裝。更全面的討論可以參考《馴服 Tiger: 并發(fā)集合》(IBM)