亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

lockObj.notifyAll(); 說是喚醒所有在lockObj對象上等待的線程,energyBoxes[from] < amount那么肯定會出現有些線程這個條件不滿足的啊,咋能喚醒全部線程呢?

lockObj.notifyAll(); 說是喚醒所有在lockObj對象上等待的線程,energyBoxes[from] < amount那么肯定會出現有些線程這個條件不滿足的啊,咋能喚醒全部線程呢?

正在回答

8 回答

喚醒線程之后 線程就會重新執行一遍run語句塊中的方法 而運行的代碼中的“?while (energyBoxes[from] < amount)”代碼就可以起到判斷的作用 若不滿足條件則繼續等待

0 回復 有任何疑惑可以回復我~

wait()在條件不滿足時調用,然后會釋放掉鎖,進入wait set等待,讓其他的線程去競爭cpu資源,當其他的線程操作引起條件的變化時,則會notifyAll()喚醒所有在wait set中等待的線程,重新判斷條件是否滿足,滿足則獲取資源,不滿足繼續進入wait set等待

2 回復 有任何疑惑可以回復我~

沒錯,所有waitSet中的線程都會被喚醒,并且同一時刻只有一條線程競爭到CPU資源,

然后開始執行transfer方法:如果還是不滿足if條件,繼續回去等待;滿足了就執行transfer操作。

然后下一個線程剛被喚醒的線程繼續進入CPU。

1 回復 有任何疑惑可以回復我~

不滿足這個條件就不會wait(),所以就不需要喚醒啊

0 回復 有任何疑惑可以回復我~

喚醒所有線程,然后重新進行一次判斷,不滿足的再次進入阻塞

2 回復 有任何疑惑可以回復我~

我猜是,energyBoxes[from]<amount的線程在失去鎖進入wait set后,線程本身沒有停下來只是不能操作被鎖的內存區域,但是線程能獲得新的amount(等于刷新自己的amount),也不知道對不對


0 回復 有任何疑惑可以回復我~

就像生產車間的庫存商品一樣,存貨不足時買家來進貨就只能進入等待,剛生產一件又有另外一個買家來進貨,又只能進入等待,直到收到通知有貨了買家才來買。這里的notifyAll就是通知了所有人

0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

lockObj.notifyAll(); 說是喚醒所有在lockObj對象上等待的線程,energyBoxes[from] < amount那么肯定會出現有些線程這個條件不滿足的啊,咋能喚醒全部線程呢?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號