Discussion:
wait和notify的問題
(时间太久无法回复)
夏傑
2007-03-03 15:59:56 UTC
Permalink
java中的wait和notify我一直搞不太懂,問題是這樣的
我run了3個thread分別是A,B,C
當A.wait()之後,就會進入wait pool中...隨後B.wait()也進入wait pool
此時wait pool中有兩個wait分別是A和B
而running中的C.notify()...
我的問題就在這裡~~C.notify會喚醒A還是喚醒B??
還是由系統決定要喚醒A或B??
可以由程式中指定要喚醒誰嗎?

--
◎龍貓資訊天地(bbs.mgt.ncu.edu.tw)
◎[vrgigi]From: 218-160-86-171.dynamic.hinet.net
ArssertionError
2007-03-04 01:15:03 UTC
Permalink
※ 引述《***@bbs.mgt.ncu.edu.tw (夏傑)》之銘言:
: java中的wait和notify我一直搞不太懂,問題是這樣的
: 我run了3個thread分別是A,B,C
: 當A.wait()之後,就會進入wait pool中...隨後B.wait()也進入wait pool
: 此時wait pool中有兩個wait分別是A和B
: 而running中的C.notify()...
: 我的問題就在這裡~~C.notify會喚醒A還是喚醒B??
: 還是由系統決定要喚醒A或B??
: 可以由程式中指定要喚醒誰嗎?
歐 這是個好問題
notify()會叫醒誰 看的是JVM 不是你個人意志能決定的
兩個都叫醒就用notifyAll()
否則 自己程式流程就要弄好 不然可能會出現無法預料的結果

以上

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.113.81.201
Alien
2007-03-05 06:37:35 UTC
Permalink
※ 引述《***@bbs.mgt.ncu.edu.tw (夏傑)》之銘言:
: java中的wait和notify我一直搞不太懂,問題是這樣的
: 我run了3個thread分別是A,B,C
: 當A.wait()之後,就會進入wait pool中...隨後B.wait()也進入wait pool
: 此時wait pool中有兩個wait分別是A和B
: 而running中的C.notify()...
: 我的問題就在這裡~~C.notify會喚醒A還是喚醒B??
: 還是由系統決定要喚醒A或B??
: 可以由程式中指定要喚醒誰嗎?

答案在 java API document 就有了
Object#notify

(怎麼今天答了同樣的問題兩次? 是同一個人嗎?)

Alien

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 202.72.0.45
(阿信)
2007-03-09 16:49:43 UTC
Permalink
※ 引述《***@bbs.mgt.ncu.edu.tw (夏傑)》之銘言:
: java中的wait和notify我一直搞不太懂,問題是這樣的
: 我run了3個thread分別是A,B,C
: 當A.wait()之後,就會進入wait pool中...隨後B.wait()也進入wait pool
: 此時wait pool中有兩個wait分別是A和B
: 而running中的C.notify()...
: 我的問題就在這裡~~C.notify會喚醒A還是喚醒B??
: 還是由系統決定要喚醒A或B??
: 可以由程式中指定要喚醒誰嗎?

想要指定喚醒誰是必須經由人工另外處理

你可以將A跟B被喚醒後,立刻做檢查條件

不符合條件就繼續wait

當有人需要叫醒A(舉例),就先設定讓A可以通過檢查條件,再notifyAll

這樣即使A跟B都被叫醒,但只有A可以通過檢查條件,B依然會繼續wait

我想這樣應該就可以達到由程式決定被喚醒者

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.59.64.166

Loading...