優化版,可以把生產和消費過程全部集中在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...