基於多執行緒的生產者與消費者模式

2021-08-21 16:18:40 字數 1354 閱讀 3245

用多執行緒實現生產者消費者模式(乙個生產者,乙個消費者),在乙個生產者生產了乙個麵包之後,消費者消費

乙個麵包,麵包不能一直生產,也不能一直消費,也不能先消費,後生產。**如下:

package bean;

/* * 1.兩個執行緒同時操作同乙份資料,如果不加上同步,那麼會出現同步安全問題,比如

* 可能先消費,在生產。

* 2.在方法上加上了同步之後,有效的阻止了先消費,在生產的情況。但是,會出現一

* 直生產,或者一直消費同乙個麵包的情況。

* 3.要想阻止一直生產,就要使用等待喚醒機制,定義乙個標記,在生產後改標記,使判斷成功後讓執行緒等待。

* */

public class alotthreat

}class shengchanzhe implements runnable

@override

public void run() }

}class xiaofeizhe implements runnable

@override

public void run() }}

class resource catch (interruptedexception e)

}else

}public synchronized void getname()

else catch (interruptedexception e) }}

}

用喚醒等待機制和判斷的好處是,即使乙個執行緒在一次執行 ,也會在判斷後進入等待狀態。

這裡需要注意的是:在使用wait的時候要格外的小心,可能會出現死鎖。 並且wait()方法是讓執行緒等待,

notify()是喚醒執行緒池中的任意乙個等待執行緒(喚醒哪乙個是隨機的),notifyall()是喚醒執行緒池中所有的等待

執行緒。

執行緒池:當乙個執行緒被wait()方法後,該執行緒會儲存到執行緒池中。

當用多執行緒來實現生產者消費者模式(多個生產者,多個消費者)時:

注意:執行緒的等待狀態是在wait()方法處等待,而不是在run()方法出等待。該**判斷用的是if-else

喚醒的執行緒是不確定的,當生產者喚醒生產者的時候,就會發生死鎖,所以要想確定喚醒對面的執行緒,只需要

把notify()方法換成notifyall()方法即可。

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...

多執行緒 生產者消費者

這個就不多說了,直接上 include include using namespace std const unsigned short size of buffer 10 緩衝區長度 unsigned short productid 0 產品號 unsigned short consumeid 0...

多執行緒 生產者消費者模式(2)

現在用佇列來實現一次這個生產者和消費者模型,程式的主要思想如下圖。乙個全域性的佇列,乙個鎖,乙個訊號量,collectimages和sendimages執行緒訪問這個佇列的時候都加鎖。全部原始碼 created by honkee on 5 17 16.include include include...