等待喚醒機制其實就是經典的「生產者與消費者」的問題。
就拿生產包子消費包子來說等待喚醒機制如何有效利用資源:
包子鋪執行緒生產包子,吃貨執行緒消費包子。當包子沒有時(包子狀態為false),吃貨執行緒等待,包子鋪執行緒生產包子(即包子狀態為true),並通知吃貨執行緒(解除吃貨的等待狀態),因為已經有包子了,那麼包子鋪執行緒進入等待狀態。接下來,吃貨執行緒能否進一步執行則取決於鎖的獲取情況。如果吃貨獲取到鎖,那麼就執行吃包子動作,包子吃完(包子狀態為false),並通知包子鋪執行緒(解除包子鋪的等待狀態),吃貨執行緒進入等待。包子鋪執行緒能否進一步執行則取決於鎖的獲取情況。
**演示:
包子資源類:
public
class
baozi
吃貨執行緒類:
public
class
chihuo
extends
thread
@override
public
void
run(
)catch
(interruptedexception e)
if(bz.flag ==
false
)catch
(interruptedexception e)
} system.out.
println
("吃貨正在吃"
+ bz.pier + bz.xianer +
"包子");
bz.flag =
false
; bz.
notify()
;}}}
}
包子鋪執行緒類:
public
class
baozipu
extends
thread
@override
public
void
run(
)catch
(interruptedexception e)
if(bz.flag ==
true
)catch
(interruptedexception e)
}// 沒有包子 造包子
system.out.
println
("包子鋪開始做包子");
if(count %2==
0)else
count++
; bz.flag =
true
; system.out.
println
("包子造好了:"
+ bz.pier + bz.xianer)
; system.out.
println
("吃貨來吃吧");
//喚醒等待執行緒 (吃貨)
bz.notify()
;}}}
}
測試類:
public
class
test
}
執行效果:
包子鋪開始做包子
包子造好了:冰皮五仁
吃貨來吃吧
吃貨正在吃冰皮五仁包子
包子鋪開始做包子
包子造好了:薄皮牛肉大蔥
吃貨來吃吧
吃貨正在吃薄皮牛肉大蔥包子
包子鋪開始做包子
包子造好了:冰皮五仁
吃貨來吃吧
吃貨正在吃冰皮五仁包子
包子鋪開始做包子
包子造好了:薄皮牛肉大蔥
吃貨來吃吧
吃貨正在吃薄皮牛肉大蔥包子
包子鋪開始做包子
包子造好了:冰皮五仁
吃貨來吃吧
吃貨正在吃冰皮五仁包子
包子鋪開始做包子
包子造好了:薄皮牛肉大蔥
吃貨來吃吧
吃貨正在吃薄皮牛肉大蔥包子
包子鋪開始做包子
包子造好了:冰皮五仁
吃貨來吃吧
吃貨正在吃冰皮五仁包子
包子鋪開始做包子
包子造好了:薄皮牛肉大蔥
吃貨來吃吧
process finished with exit code -
1
生產者消費者,多執行緒問題
從上乙個小測試當中,我們會發現執行緒之間存在爭奪問題,所以在這裡用上了訊號鎖 include include include include include include include define max size 5 struct data structpro max size sem t ...
多執行緒 生產者消費者問題
package multithreading.pc 測試 生產者消費者模型 利用緩衝區解決 管程法 生產者,消費者,產品,緩衝區 public class testpc 生產者 class productor extends thread 生產 override public void run 消費...
多執行緒 生產者消費者
這個就不多說了,直接上 include include using namespace std const unsigned short size of buffer 10 緩衝區長度 unsigned short productid 0 產品號 unsigned short consumeid 0...