在多執行緒的開發中,如果生產者建立資源的速度很快,而消費者消費的速度慢,這時生產者就要去等待消費者,這樣會影響到處理的效率,反之亦然。為了處理這樣的場景,我們需要準備乙個緩衝區,即乙個池子,生產者生產好後將資源存在緩衝區中,當快取區滿了就停止生產,消費者直接從快取區中獲取資源,當快取區空了就停止消費,通知生產者生產。
生產者與消費者一般有兩種實現方式,一種是管程法(即建立快取區的方式),另一種是訊號燈法(設定乙個標識位實現)
例如,我們想要實現乙個生產者生產漢堡,消費者消費漢堡的場景。在這個場景中我們有四個物件,生產者、消費者、漢堡和快取區。
生產者
//生產者
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 消費者函...