多執行緒之公牛的生產與宰殺(消費者與生產者)

2021-07-16 18:52:14 字數 1444 閱讀 1722

多執行緒中的生產者與消費者的問題,重點是統一資源的使用,涉及執行緒同步。課堂練習習題之牛的培養和宰殺來代替生產和消費。

首先定義的是乙個牛(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.當生產者生產...