java多執行緒-生產者與消費者模型(有限緩衝問題)
阿新 • • 發佈:2019-01-01
文章目錄
1.預備知識點
執行緒同步
同步就是協同步調,按預定的先後次序進行執行。如:你說完,我再說。“同”字從字面上容易理解為一起動作其實不是,“同”字應是指協同、協助、互相配合;。在多執行緒程式設計裡面,一些敏感資料不允許被多個執行緒同時訪問,此時就使用同步訪問技術,保證資料在任何時刻,最多有一個執行緒訪問,以保證資料的完整性
是什麼:什麼是生產者消費者模型?
生產者消費者問題,也稱有限緩衝問題 (一個多執行緒同步問題的經典案例)
2.問題描述
將“生產者和消費者”模型用多執行緒機制實現。分別建立消費者類、生產者類、堆疊類,其中消費者類和生產者類分別實現執行緒介面。
問題解析;
1、生產者與消費者不能同時進行工作,形成的是互斥關係;
2、生產者與生產者之間不能同時生產,處於互斥關係;
3、消費者與消費者之間不能同時工作,處於互斥關係;
4、當緩衝區之內的資源滿時,生產者不能生產;
5、當緩衝區之內的資源空時,消費者不能消費;
6、消費者消費的速度不能超過生產者;
3.java實現方式的預備知識
:
wait() 與 notify/notifyAll 方法必須在同步程式碼塊中使用
wait() 與 notify/notifyAll() 是Object類的方法
在這篇:JAVA多執行緒之Synchronized關鍵字–物件鎖的特點文章中介紹了使用synchronized關鍵字獲得鎖。因此,wait() 與 notify/notifyAll() 經常與synchronized搭配使用,即在synchronized修飾的
同步程式碼塊或方法裡面呼叫wait() 與 notify/notifyAll()方法。
notify()喚醒任意一個wait()的執行緒;
notifyAll()喚醒所有的wait()的執行緒處於就緒狀態;------(喚醒等待執行緒並不等於讓出當前的執行緒,執行緒依舊鎖定知道當前執行緒完成);
方法辨析:Thread.sleep()執行緒睡眠;
1、執行緒睡眠是幫助所有執行緒獲得執行機會的最好方法。
ps: sleep(0)讓
2、執行緒睡眠到期自動甦醒,並返回到可執行狀態,不是執行狀態。sleep()中指定的時間是執行緒不會執行的最短時間。因此,sleep()方法不能保證該執行緒睡眠到期後就開始執行。--------注意這裡的sleep()與執行緒鎖沒有關係; sleep()並不釋放鎖;
一種特殊的情況:線上程持有物件鎖時,使用sleep()睡眠當前執行緒,並不會釋放當前鎖,所以隨眠結束後,執行緒恢復原有執行轉態,仍然是同步當前執行緒的;
3、sleep()是靜態方法,只能控制當前正在執行的執行緒。
另附:多執行緒問題:
Object類中與執行緒有關的方法:
1)notify/notifyAll
2)wait()/wait(long)
java.lang.Thread中與之相關的方法:
1)interrupt()
2)sleep()/sleep(long)
3)join()/suspend()/resume()....