資源喚醒案例

2021-10-14 01:58:17 字數 4181 閱讀 9013

建立乙個資源類:包子

package demo001;

/* *@author wanghongyuan

*@create 2021/1/6 8:01

*//*

資源類:包子類

設定包子的屬性皮陷

包子的狀態:有true 沒有 false

*/public

class

baozi

包子鋪類

package demo001;

/* *@author wanghongyuan

*@create 2021/1/6 8:06

*//*

生產者(包子鋪)類:是乙個執行緒類,可以繼承thread

設定執行緒任務(run):生產包子

對包子的狀態進行判斷

true:有包子

包子鋪呼叫wait方法進入等待狀態

false:沒有包子

包子鋪生產包子

增加一些趣味性:交替產生兩種包子

有兩種狀態(i%2==0)

包子鋪生產好了包子

修改包子的狀態為true有

喚醒吃貨執行緒,讓吃貨執行緒吃包子

注意:包子鋪執行緒和包子執行緒關係:-->通訊(互斥)

必須使用同步技術保證兩個執行緒只有乙個在執行

鎖物件必須保證唯一,可以使用包子物件作為鎖物件

包子鋪類和吃貨的類就需要把包子物件作為引數傳遞進來

1.需要在成員位置建立乙個包子變數

2.使用帶參的構造方法,為包子變數賦值

*/// 生產者(包子鋪)類:是乙個執行緒類,可以繼承thread

public

class

baozipu

extends

thread

// 設定執行緒任務(run):生產包子

@override

public

void

run(

)catch

(interruptedexception e)

}// 被喚醒之後執行,包子鋪生產包子

// 增加些趣味性:交替生產兩種包子

if(count%2==

0)else

count++

; system.out.

println

("正在生產"

+bz.pi+bz.xian+

"的包子");

// 生產包子需要3秒鐘

trycatch

(interruptedexception e)

// 包子鋪生產好了包子

// 修改包子的狀態為有

bz.flag =

true

;// 喚醒吃貨執行緒,讓吃貨執行緒吃包子

bz.notify()

; system.out.

println

("包子鋪已經生產好了"

+bz.pi+bz.xian+

"的包子,吃貨可以開吃了");

}}}}

吃貨類

package demo09.lock;

/* @author wanghongyuan

@date 2021/1/6 */

/* 消費者(吃貨)類:是乙個執行緒類,可以繼承thread

設定執行緒任務(run):吃包子

false:沒有包子

吃貨呼叫wait方法進入等待狀態

true:有包子

吃貨吃包子

吃貨吃完包子

修改包子的狀態為false沒有

吃貨喚醒包子鋪執行緒,生產包子

*/public

class

chihuo

extends

thread

// 設定執行緒任務(run):吃包子

@override

public

void

run(

)catch

(interruptedexception e)

}// 被喚醒之後:執行的**

system.out.

println

("吃貨正在吃包子"

+bz.pi+bz.xian+

"的包子");

// 吃完包子將包子的狀態修改為false

bz.flag =

false

;// 吃貨喚醒包子鋪執行緒,生產包子

bz.notify()

; system.out.

println

("吃貨已經把"

+bz.pi+bz.xian+

"的包子吃完了,包子鋪開始生產包子");

system.out.

println

("***********************************===");

}}}}

測試類,執行類

package demo09.lock;

/* @author wanghongyuan

@date 2021/1/6 */

/* 測試類:

包含main方法,程式執行的入口,啟動程式

建立包子物件

建立包子鋪執行緒,開啟,生產包子

建立吃貨執行緒,開啟,吃包子

*/public

class

demo

}

結果展示

正在做薄皮三鮮餡的包子

包子鋪已經生產好了薄皮三鮮餡的包子,吃貨可以開吃了

吃貨正在吃包子薄皮三鮮餡的包子

吃貨已經把薄皮三鮮餡的包子吃完了,包子鋪開始生產包子

***********************************===

正在做冰皮牛肉大蔥餡的包子

包子鋪已經生產好了冰皮牛肉大蔥餡的包子,吃貨可以開吃了

吃貨正在吃包子冰皮牛肉大蔥餡的包子

吃貨已經把冰皮牛肉大蔥餡的包子吃完了,包子鋪開始生產包子

***********************************===

正在做薄皮三鮮餡的包子

包子鋪已經生產好了薄皮三鮮餡的包子,吃貨可以開吃了

吃貨正在吃包子薄皮三鮮餡的包子

吃貨已經把薄皮三鮮餡的包子吃完了,包子鋪開始生產包子

***********************************===

正在做冰皮牛肉大蔥餡的包子

包子鋪已經生產好了冰皮牛肉大蔥餡的包子,吃貨可以開吃了

吃貨正在吃包子冰皮牛肉大蔥餡的包子

吃貨已經把冰皮牛肉大蔥餡的包子吃完了,包子鋪開始生產包子

***********************************===

正在做薄皮三鮮餡的包子

包子鋪已經生產好了薄皮三鮮餡的包子,吃貨可以開吃了

吃貨正在吃包子薄皮三鮮餡的包子

吃貨已經把薄皮三鮮餡的包子吃完了,包子鋪開始生產包子

***********************************===

正在做冰皮牛肉大蔥餡的包子

包子鋪已經生產好了冰皮牛肉大蔥餡的包子,吃貨可以開吃了

吃貨正在吃包子冰皮牛肉大蔥餡的包子

吃貨已經把冰皮牛肉大蔥餡的包子吃完了,包子鋪開始生產包子

***********************************===

正在做薄皮三鮮餡的包子

包子鋪已經生產好了薄皮三鮮餡的包子,吃貨可以開吃了

吃貨正在吃包子薄皮三鮮餡的包子

吃貨已經把薄皮三鮮餡的包子吃完了,包子鋪開始生產包子

***********************************===

正在做冰皮牛肉大蔥餡的包子

包子鋪已經生產好了冰皮牛肉大蔥餡的包子,吃貨可以開吃了

吃貨正在吃包子冰皮牛肉大蔥餡的包子

吃貨已經把冰皮牛肉大蔥餡的包子吃完了,包子鋪開始生產包子

***********************************===

等待喚醒機制包子鋪案例

概念 多個執行緒在處理同乙個資源,處理的動作 任務 不同 資源類 包子類 設定包子的屬性 皮 餡 包子的狀態 有true,沒有false public class baozi 包子鋪 執行緒類,繼承thread 設定執行緒任務run 生產包子 對包子的狀態判斷 true 呼叫wait方法進入等待狀態...

等待喚醒案例 wait方法和notifyAll方法

package text2 public class demo6waitandnotify catch interruptedexception e 喚醒之後執行的 system.out.println 包子做好了,開吃!start 建立乙個老闆執行緒 newthread catch interru...

喚醒案例 執行緒之間的通訊

建立乙個顧客執行緒 消費者 建立乙個老闆執行緒 生產者 注意 顧客和老闆執行緒必須使用同步 塊包裹起來,保證等待和喚醒只能有乙個人在執行.同步使用的鎖物件必須保證唯一.只有鎖物件才能呼叫wait和notify方法.public class waitandnotify catch interrupte...