1. 程式人生 > 實用技巧 >JAVA系列:Synchronized生產者 消費者例子

JAVA系列:Synchronized生產者 消費者例子

目錄

引子(一個生產者消費者)

例子(多個生產者消費者)

生產消費交替進行


引子(一個生產者消費者)

刪除準備取數消費S1執行緒

刪除準備取數消費S2執行緒

新增資料準備 生產A執行緒

新增資料完成 生產A執行緒(發出喚醒)

刪除取數開始消費S2執行緒(接收喚醒)

刪除取數完成消費S2執行緒

刪除取數開始消費S1執行緒(接收喚醒)

Exception in thread "消費S1執行緒" java.lang.IndexOutOfBoundsException: Index: 0, Size: 0

at java.util.ArrayList.RangeCheck(ArrayList.java:547)

at java.util.ArrayList.remove(ArrayList.java:387)

at Customer.subtract(Test.java:45)

at ThreadCustomer.run(Test.java:71)

at java.lang.Thread.run(Thread.java:662)

因生成之後,喚醒了全部等待的執行緒,結果所有的wait()後面的程式繼續執行,進而出錯。

將if( ValueObj.list.size() == 0 )改為//while( ValueObj.list.size() == 0 )後正常。

例子(多個生產者消費者)

生產完成通知,生產者:生產者A

生產完成通知,生產者:生產者B

生產完成通知,生產者:生產者C

消費完成通知,消費者3

消費完成通知,消費者1

消費完成通知,消費者2

生產完成通知,生產者:生產者A

生產完成通知,生產者:生產者B

生產完成通知,生產者:生產者C

生產完成通知,生產者:生產者A

生產完成通知,生產者:生產者B

消費完成通知,消費者3

消費完成通知,消費者2

生產完成通知,生產者:生產者C

消費完成通知,消費者1

.......

生產消費交替進行

---backA---

---backB---

backA wiat

---backA---

backA wiat

backA wiat

---backB---

backA wiat

---backA---

backA wiat

backA wiat

---backB---