生產者檢查倉庫是否已經滿了,如果沒滿,將生產產品;如果倉庫已滿,停止生產產品。
消費者檢查倉庫是否已空,倉庫不空,消費者消費產品;若空,消費者停止消費產品。
分析:
這是乙個執行緒同步問題,生產者和消費者共享同乙個資源,並且生產者和消費者之間相互依賴,互為條件。
對於生產者,沒有生產產品之前,要通知消費者等待。而生產了產品之後,又需要馬上通知消費者消費。
對於消費者,在消費之後,要通知生產者已經消費結束,需要繼續生產新產品以供消費。
執行緒通訊:
通過上面的分析,重點在於多執行緒之間的通訊。
採用生產者和消費者的模式,主要有兩種方法:管程法、訊號燈法
程式中各個角色的定位
生產者:乙個或多個(多執行緒) ——producers類
消費者:乙個或多個(多執行緒) ——consumers類
倉庫:含有多個產品(緩衝容器)——buffer類
產品 ——products類
**實現
package io.github.studyrecodring;
/***
* 多執行緒中併發協作的管程法
* 生產者消費者模式
* @author
* */
public
class
cotest01
}/**
* 生產者
* @author
* */
class
producers
extends
thread
@override
public
void
run()}
}/**
* 消費者
* @author
* */
class
consumers
extends
thread
@override
public
void
run()}
}/**
* 緩衝區容器(只能包含10件產品)
* @author
* */
class
buffer
catch
(interruptedexception e)
}this
.products[count]
=products;
count++
;//緩衝區有資料,可以繼續取產品
this
.notifyall()
;}//取產品
public
synchronized products pop()
catch
(interruptedexception e)
} count--
; products product=
this
.products[count]
;//取產品後,有剩餘空間,可以繼續生產產品
this
.notifyall()
;return product;}}
/** * 產品
* @author
* */
class
products
public
intgetid()
public
void
setid
(int id)
}
訊號燈法相較於管程法的不同在於,管程法是通過判斷倉庫的空或滿來進行生產和消費,而訊號燈法是通過乙個標誌來判斷是否生產和消費。如以下**,通過判斷紅綠燈來判斷人走還是車走。
程式實現
package io.github.studyrecodring;
/***
* 多執行緒中併發協作的訊號燈法
* 生產者消費者模式
* @author
* */
public
class
cotest03
}class
people
extends
thread
public
void
run()}
}class
carextends
thread
@override
public
void
run()}
}class
traffic
light light;
public
traffic()
public
synchronized
void
people()
catch
(interruptedexception e)}
system.out.
println
(light+
"人走");
light=light.red;
this
.notifyall()
;}public
synchronized
void
car(
)catch
(interruptedexception e)}
system.out.
println
(light+
"車走");
light=light.green;
this
.notifyall()
;}}
java多執行緒系列03
建立執行緒的兩種方式 1繼承thread類,步驟 1定義類繼承thread 2複寫thread類中的run方法,目的 將自定義的 儲存在run方法,讓執行緒執行 3呼叫該執行緒的start方法,該方法兩個作用 啟動執行緒,呼叫run方法。此時執行緒處於runnable狀態 從而使執行緒啟動去同其他執...
03 Java多執行緒 執行緒等待通知機制
三 執行緒等待通知 四 參考 如果等待時長為t,當前時間為now,那麼now t以後超時 long overtime now t long remain t while result不滿足 remian 0 return result shop類模擬商店,初始狀態玩具是nothing,執行緒等待玩具...
07 多執行緒03
1.中斷執行緒的執行 當乙個執行緒執行的時候,另乙個執行緒可以呼叫對應的thread的物件的 interrupt 方法來中斷它 public void interrupt 2.判斷執行緒是否中斷 public boolean isinterrupted 3.多執行緒資源協調問題 多執行緒同時去操作乙...