Java多執行緒03

2021-09-10 10:41:33 字數 2880 閱讀 3340

生產者檢查倉庫是否已經滿了,如果沒滿,將生產產品;如果倉庫已滿,停止生產產品。

消費者檢查倉庫是否已空,倉庫不空,消費者消費產品;若空,消費者停止消費產品。

分析:

這是乙個執行緒同步問題,生產者和消費者共享同乙個資源,並且生產者和消費者之間相互依賴,互為條件。

對於生產者,沒有生產產品之前,要通知消費者等待。而生產了產品之後,又需要馬上通知消費者消費。

對於消費者,在消費之後,要通知生產者已經消費結束,需要繼續生產新產品以供消費。

執行緒通訊:

通過上面的分析,重點在於多執行緒之間的通訊。

採用生產者和消費者的模式,主要有兩種方法:管程法、訊號燈法

程式中各個角色的定位

生產者:乙個或多個(多執行緒)   ——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.多執行緒資源協調問題 多執行緒同時去操作乙...