生產者和消費者

2021-09-29 10:43:58 字數 2037 閱讀 8379

兩個角色:生產者和消費者

執行緒公共變數(判斷條件)

用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個 如果生產者試圖生產更多的產品,店員會叫生產者停一下,如果店員中有空位放產品,再通知生產者繼續生產 如果店中沒有產品,店員會告...