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


















































































































































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








































































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