1. 程式人生 > >java多執行緒-生產者與消費者模型(有限緩衝問題)

java多執行緒-生產者與消費者模型(有限緩衝問題)

文章目錄


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()....

4.實現

https://pan.baidu.com/s/1Sk4-QYf5zTxz1G2ywgKigQ