生產者與消費者(二十五)

2022-06-16 06:30:12 字數 2636 閱讀 2674

在多執行緒的開發中,如果生產者建立資源的速度很快,而消費者消費的速度慢,這時生產者就要去等待消費者,這樣會影響到處理的效率,反之亦然。為了處理這樣的場景,我們需要準備乙個緩衝區,即乙個池子,生產者生產好後將資源存在緩衝區中,當快取區滿了就停止生產,消費者直接從快取區中獲取資源,當快取區空了就停止消費,通知生產者生產。

生產者與消費者一般有兩種實現方式,一種是管程法(即建立快取區的方式),另一種是訊號燈法(設定乙個標識位實現)

例如,我們想要實現乙個生產者生產漢堡,消費者消費漢堡的場景。在這個場景中我們有四個物件,生產者、消費者、漢堡和快取區。

生產者

//生產者

class productor implements runnable

@override

public void run()

}}

消費者
//消費者

class customer implements runnable

@override

public void run()

}}

漢堡
//漢堡

class hamburger

}

快取區
//快取區

class syncontainer catch (interruptedexception e)

}//如果快取區中漢堡數量為0,則生產漢堡

hamburgers[count] = hamburger;

count++;

this.notifyall();

}public synchronized hamburger pull () catch (interruptedexception e)

}//如果快取區中漢堡數量》0,則消費漢堡

hamburger hamburger = hamburgers[count-1];

count--;

this.notifyall(); //已經消費了,通知生產者可以生產了

return hamburger;

}}

main方法
public class guancheng 

}

我們執行起來,看下結果,生產者將生產的漢堡存放在快取區,消費者直接從快取區中獲取漢堡:

快取區已空,停止消費

生產了第1個漢堡

生產了第2個漢堡

生產了第3個漢堡

生產了第4個漢堡

生產了第5個漢堡

生產了第6個漢堡

消費了第1個漢堡

快取區已滿,停止生產

消費了第6個漢堡

生產了第7個漢堡

消費了第7個漢堡

消費了第8個漢堡

生產了第8個漢堡

消費了第5個漢堡

消費了第9個漢堡

消費了第4個漢堡

消費了第3個漢堡

消費了第2個漢堡

快取區已空,停止消費

生產了第9個漢堡

生產了第10個漢堡

消費了第10個漢堡

訊號燈法就是設定乙個標識位,當標識位flag位true時,進行生產;當標識位為false時,進行消費。

下面是乙個紅綠燈的例子,當標識位改變時,分別讓行人和車輛通行。

package com.proandcum;

public class xinhao

}class car implements runnable

@override

public void run()

}}class walker implements runnable

@override

public void run()

}}class road catch (interruptedexception e)

}system.out.println("通過了第"+(++carcount)+"輛車");

flag = !this.flag;

this.notifyall();

}public synchronized void walk () catch (interruptedexception e)

}system.out.println("通過了第"+(++walkercount)+"個行人");

flag = !this.flag;

this.notifyall();

}}

下面是**執行起來的結果:

通過了第1輛車

通過了第1個行人

通過了第2輛車

通過了第2個行人

通過了第3輛車

通過了第3個行人

通過了第4輛車

通過了第4個行人

通過了第5輛車

通過了第5個行人

通過了第6輛車

通過了第6個行人

通過了第7輛車

通過了第7個行人

通過了第8輛車

通過了第8個行人

通過了第9輛車

通過了第9個行人

通過了第10輛車

通過了第10個行人

可以看到訊號燈的改變依次讓行人和車輛通行。

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

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

生產者與消費者

include include include include include include define size of buffer 10 int buffer size of buffer 緩衝陣列 int in 0,out 0 採用迴圈佇列方式進行陣列的訪問 宣告訊號量 sem t ful...

生產者與消費者

include include include include include include handle mutex 互斥訊號量 handle full 滿緩衝區訊號量計數 handle empty 空緩衝區訊號量計數 void producer 生產者函式 void consumer 消費者函...