執行緒同步問題,生產者和消費者共享同乙個資源,並且生產者和消費者之間相互依賴,互為條件。
分析:生產者------沒有生產產品之前,要通知消費者等待,生產產品之後,需要通知消費者消費;
消費者------在消費完之後,要通知生產者消費結束,需要生產新的產品,以供消費。
在這個問題中,只是用synchronized遠遠不夠,因為,synchronized不能用來實現不同執行緒之間的訊息傳遞。這個時候就需要使用執行緒通訊來實現不同執行緒之間的通訊。
使用執行緒通訊方法
方法名作用
wait()
表示執行緒一直等待,知道其他執行緒通知,釋放執行緒上的鎖
wait(long timeout)
指定等待毫秒數
notify()
喚醒乙個處於等待狀態的執行緒
notifyall()
喚醒同乙個物件上所有呼叫wait()方法的執行緒,優先順序高的先排程
這些方法只能在同步方法或者同步**塊中使用。
/**
* 管程法:解決生產者——消費者問題
*/public
class
testpc
}//生產者
class
producer
extends
thread
@override
public
void
run(
)catch
(interruptedexception e)
system.out.
println
("生產了"
+ i +
"隻雞");
}}}//消費者
class
consumer
extends
thread
@override
public
void
run(
)catch
(interruptedexception e)}}
}class
chicken
}class
syncontainer
//如果沒有滿,丟入產品
chickens[count]
= chicken;
count++
;this
.notifyall()
;}public
synchronized chicken pop()
throws interruptedexception
count --
; chicken chicken = chickens[count]
;//消費者消費完了,通知生產者生產
this
.notifyall()
;return chicken;
}}
package syn;
/** * 訊號燈法解決生產者——消費者問題
* 廚師生產,食客消費
*/public
class
testpc3
}//生產者--廚師
class
cooker
extends
thread
@override
public
void
run(
)catch
(interruptedexception e)}}
}//消費者
class
diners
extends
thread
@override
public
void
run(
)catch
(interruptedexception e)}}
}//產品 -- 食物
class
food
system.out.
println
("廚師做了"
+ foodname)
;//通知食客可以吃了
this
.notifyall()
;this
.foodname = foodname;
this
.flag =
!this
.flag;
}//食客吃飯
public
synchronized
void
eat(
)throws interruptedexception
system.out.
println
("吃了"
+ foodname)
;this
.notifyall()
;this
.flag =
!this
.flag;
}}
生產者消費者執行緒
include include include includeusing namespace std typedef int semaphore 訊號量是一種特殊的整型變數 const int size of buffer 5 緩衝區長度 const unsigned short producers...
生產者消費者執行緒
該簡單生產者 消費者執行緒,屬於本人學習過程中的一段練習 如有不足,請指點 package com.lanqiao.demo3 author 大廣子 類說明 簡單的生產者,消費者執行緒 public class threadptcs catch interruptedexception e 退出 s...
執行緒協作和通訊問題 生產者和消費者問題
解決辦法一 管程法 設定緩衝區 package gcf 生產者,消費者,產品,緩衝區 public class testgcf 生產者 class productor extends thread override public void run 消費者 class cumextends threa...