Java 多執行緒之生產者消費者優化版

2021-07-03 04:17:18 字數 2166 閱讀 1415

優化版,可以把生產和消費過程全部集中在baozi 裡,生產者和消費者只需要下指令就好

重點是如何在baozi內實現兩個方法:

對於生產者而言,true時沒有包子,需要生產,生產完了,要通知正在等待的消費者,同時要置為false,表示已經有包子了,

false下,生產者就是要等待,等待消費者傳來訊息

對於消費者來說,false時有包子,可以去拿,拿了包子要通知生產者,置為true;true的狀態下等生產者發來訊息

ok,走起,出問題,一直在生產一種包子

有誤版的資源池:

package com.rjl.producerandcustomer;

public class baozi

else catch (interruptedexception e)

}

}

public synchronized void get()

else catch (interruptedexception e)

} } }

問題在哪?

生產者和消費者的執行緒誰先啟動要看cpu的排程,具有隨機性

假如生產者的執行緒先啟動,此時生產狗不理,生產了要notify,而這個時候消費者的執行緒有可能還沒起來,又去排程生產者,這個時候x自增了,變成1,按理說這個時候要生產豬扒包,但是這個時候flag還是true,因為沒有消費者去置為false,也即是說生產者只能走到else的**塊裡,在else裡就只能等待,被掛起了,什麼也做不了,那麼這時候可以去排程消費者的執行緒,正好true可以拿,把flag置為false,並且通知生產者

這個時候生產者在else裡被掛起,cpu排程他走起,什麼也不做,直接退出了,相當於什麼也沒生產,又從頭開始生產,還是狗不理。

有可能如此迴圈數次

邏輯上的錯誤,沒就生產,有就等待,這並不是乙個if-else的關係

如何修改?問題是出在消費者沒啟動從而使生產者進入掛起狀態,那麼現在就應該做到,即使消費者沒啟動,回來進生產者不是掛機而是依然判斷一下,然後找消費者,直到消費者啟動了,消費了這個包子,換個角度,一定要生產包子,然後等,等了之後一定還要生產,不能等完了就結束了。

那麼,生產者的執行緒啟動時,應該先判斷是否是true,需要掛起,掛起了就轉去消費者,即使這個時候消費者的執行緒依然沒啟動,回來還是在判斷,判斷了掛機,還是去找消費者,如此迴圈,直到消費者啟動了。

同樣,消費者也是先判斷,是否是需要等待掛起,不需要等待才去拿包子

最終版資源池:

public class baozi  catch (interruptedexception e) 	

}

this.name=name;

this.price =price;

this.flag=true;

this.notify();

system.out.println("producer set "+ this.name+" "+this.price );

}public synchronized void get() catch (interruptedexception e)

} system.out.println("customer got "+ this.name+" "+this.price );

this.flag=false;

this.notify(); }}

Java多執行緒之消費者生產者模式

這個例項應該是學習執行緒的乙個經典例子,生產者和消費者模式。寫的很好,詳細請看內容。author shijin 生產者與消費者模型中,要保證以下幾點 1 同一時間內只能有乙個生產者生產 生產方法加鎖sychronized 2 同一時間內只能有乙個消費者消費 消費方法加鎖sychronized 3 生...

java多執行緒之消費者生產者模式

author shijin 生產者與消費者模型中,要保證以下幾點 1 同一時間內只能有乙個生產者生產 生產方法加鎖sychronized 2 同一時間內只能有乙個消費者消費 消費方法加鎖sychronized 3 生產者生產的同時消費者不能消費 生產方法加鎖sychronized 4 消費者消費的同...

Java 多執行緒之生產者消費者模型

package com.yuanlief public class main 共享資料類 class mydata 共享資料控制類 class sharedata catch interruptedexception e this.data data writeable false 標記已經生產 n...