兩個角色:生產者和消費者
執行緒公共變數(判斷條件)
用synchronized
class
aircondition
public
intgetnumber()
public
aircondition
(int number)
public
synchronized
void
increment()
throws exception
//第二步幹活
number++
;
system.out.
println
(thread.
currentthread()
.getname()
+"生產了乙個"
+number)
;//第三步通知
this
.notifyall()
;}public
synchronized
void
decrement()
throws exception
number--
;
system.out.
println
(thread.
currentthread()
.getname()
+"消費了乙個"
+number)
;this
.notifyall()
;}}
在只有兩個執行緒的時候,不是生產者就是消費者。
notifyall();若生產者喚起所有執行緒,當前執行緒並沒有wait();,喚起的就是唯一的另乙個執行緒消費者。
當多個執行緒的時候,如生產者喚起所有執行緒,喚起的不只有消費者執行緒,可能還有另乙個生產者執行緒。
在最初學習時習慣寫if()判斷,被喚起的生產者執行緒可能已經通過了if()判斷,而此時公共變數已經被改變了,被喚起的生產者執行緒在此基礎上的操作很有可能就出錯了。
可以學習jdk文件裡找wait()介紹,可知應用while迴圈判斷,如此當執行緒被喚起時還會被判斷一次。
用lock方法
class
aircondition
public
intgetnumber()
public
aircondition
(int number)
public
void
increment()
throws exception
//第二步幹活
number++
;
system.out.
println
(thread.
currentthread()
.getname()
+"生產了乙個"
+number)
;
condition.
signalall()
;//相當於notifyall();
}finally
}public
synchronized
void
decrement()
throws exception
number--
;
system.out.
println
(thread.
currentthread()
.getname()
+"消費了乙個"
+number)
;
condition.
signalall()
;}finally
}}
synchronized 和lock不能混用,wait功能由condition的await方法實現,notrifyall由signalall方法實現。 生產者消費者 生產者與消費者模式
一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...
生產者和消費者
package demo.one public class producerconsumerdemo 資源 class resource catch interruptedexception e this.name name count system.out.println thread.curre...
生產者和消費者
package com.yuxinyicheng.test2 生產者和消費者的問題 生產者將產品交給店員,而消費者從店員處取走產品,店員一次只能有固定數量的產品 比如 20個 如果生產者試圖生產更多的產品,店員會叫生產者停一下,如果店員中有空位放產品,再通知生產者繼續生產 如果店中沒有產品,店員會告...