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

2021-10-12 09:30:58 字數 1484 閱讀 6860

一、什麼是生產者與消費者模式

其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不讓消費者訪問,當消費者消費時鎖住倉庫,不讓生產者訪問倉庫。舉乙個簡單的例子,有乙個生產者生產包子,他將生產好的包子放到筐中,放完包子由消費者從筐中拿出包子使用。當然筐還有乙個作用就是當筐中沒有包子時便鎖住筐,不讓消費者去筐中再拿取東西,當筐中有包子時,不讓生產者再向筐中放入包子。

二、實現生產者與消費者模式

乙個簡單的方法就是使用使用object的wait/notify的訊息通知機制

wait():呼叫了wait()方法的執行緒進入等待池進行等待,等待池中的執行緒不去競爭物件鎖,直到其它的執行緒通知,才會進入鎖池

notify():隨機喚醒乙個在該物件上等待的執行緒,被喚醒的執行緒進行鎖池,開始競爭該對鎖上的鎖

notifyall():喚醒所有在該物件上等待的執行緒,優先順序高的執行緒有可能先競爭到,物件鎖只能在同步方法和同步**塊中使用。

簡單的例子:

//建立饅頭物件

class mantou

}

接下來建立緩衝區筐

//建立筐

class syncstack catch (interruptedexception e)

// 喚醒當前物件等待池中的第乙個等待執行緒

} this.notify();

ms[index] = m;

index++;

} // 建立取饅頭的鎖

public synchronized mantou pop() catch (interruptedexception e)

} this.notify();

index--;

return ms[index];

}}

建立生產者

class producter extends thread 

@override

public void run()

}}

建立消費者

class consumer extends thread 

@override

public void run()

}}

編寫測試類

public class test1 

}

總結:一定要注意自己加的index來判斷資料倉儲是否存滿的設定,或者也可以設定乙個布林型別變數來判斷。加在while迴圈中以防止早期通知,或者遺漏通知。

生產者消費者

using system using system.collections.generic using system.threading namespace gmservice foreach thread thread in producers q.exit console.read public...

生產者消費者

執行緒通訊 乙個執行緒完成了自己的任務時,要通知另外乙個執行緒去完成另外乙個任務.wait 等待 如果執行緒執行了wait方法,那麼該執行緒會進入等待的狀態,等待狀態下的執行緒必須要被其他執行緒呼叫notify方法才能喚醒。notify 喚醒 喚醒執行緒池等待執行緒其中的乙個。notifyall 喚...

生產者消費者

生產者和消費者是一種經典的供求案例,生產者和消費者執行緒之間的關係涉及執行緒之間的互動。生產者執行緒產生的資料項,將來會被消費者消費,每個生產出來的資料會被儲存在乙個共享的倉庫中。假設執行緒以不同的速度進行,那麼將會導致消費者可能獲取到還未生產的資料,生產者也有可能在消費者還未取走前一條資料的前提下...