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---