多執行緒中的生產者與消費者的問題,重點是統一資源的使用,涉及執行緒同步。課堂練習習題之牛的培養和宰殺來代替生產和消費。
首先定義的是乙個牛(ox)類,包括牛的年齡和體重;其次,是牛的培養工廠(oxpen),在工廠中,分別儲存成牛和牛犢,使用集合,因為牛犢和成牛的數量是動態變化,牛犢的初始化變數是100只。然後是培養方法和宰殺方法
培養方法:當牛犢的集合大於0時代表有牛犢可以培養,此時,就移除乙隻牛犢,然後將體重賦值200,年齡超過4,代表牛犢成了成牛,然後將此例項放入成牛的集合。
**如下:`public synchronized void growox()
}`宰殺方法:也就是我們的消費方法,取出成牛集合中的牛,然後判斷是否體重大於200,年齡大於4,為真則將牛殺了,移除該元素。
public synchronized void
killox()
}
這裡的宰殺和培養方法都是鎖著的,防止出現生產或者宰殺時,牛的數量為負,增加了執行緒安全。
然後我們寫了兩個執行緒乙個是消費執行緒,乙個是生產線程:
分別實現牛的生產和消費;
當牛犢的集合長度大於0的時候,方能進行成牛的培養;
而成牛的消費則是成牛的集合的數量大於0的時候才可以進行消費,當成牛的數量小於0並且牛犢的集合中還有牛時,進行執行緒等待,
public
class
consumerrunable
implements
runnable
@override
public
void
run() catch (interruptedexception e)
}else
if(oxpen.oxlist.size()>0)}}
}
生產線程:
package main03.review02;
//消費程序
public
class
producerunable
implements
runnable
@override
public
void
run() catch (interruptedexception e)
oxpen.growox();}}
}
博主出現了乙個問題就是沒有設定消費者執行緒的中的判斷;如果不判斷成牛的數量直接使用的話,在宰殺方法中,會出現娶不到第乙個元素,從而報錯。
while(oxpen.oxlist
.size()>0||oxpen.oxvector
.size()>0){
if(oxpen.oxvector
.size()<=0&&oxpen.oxlist
.size()>0){
就是這幾行元素。 多執行緒之生產者與消費者問題
考慮這樣乙個飯店,他有乙個廚師和乙個服務生,然後服務生必須等待廚師準備好食物,當廚師準備好食物時,他會通知服務生,然後服務生上菜,然後返回繼續等待。食物 class meal public string tostring 服務生 class waitperson implements runnabl...
多執行緒之生產者與消費者問題
生產者生產產品後將產品放在乙個倉庫裡,消費者購買省商品相當於從倉庫裡拿出商品。這其中涉及到的有生產者 消費者與倉庫以及產品四個物件,因此需要建立四個類來表示。最後還需要乙個測試類。對於生成與消費這兩個動作可是是同時執行的 只要有商品的話 因此需要使用到多執行緒的知識。product類 public ...
多執行緒之生產者與消費者模型
在這個模型中我們需要有三個主要類,分別是商品類,生產者類以及消費者類。其中執行機制和我們平時的生產者與消費者的關係機制大同小異。在這個模型中,我們需要定義乙個容器來實現消費者與生產者之間的解耦,為了更貼近實際,採用fifo原則的佇列作為容器為最佳選擇,並且此模型還遵循著以下兩條規則 1.當生產者生產...