第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

一直wait導致程序無法停止怎么解決?

試圖停止線程,在EnergyTransferTask類中加入退出旗標,修改后代碼如下:

public?class?EnergyTransferTask?implements?Runnable?{
????private?EnergySystem?energySystem;//?共享的能量世界
????private?int?fromBox;//?能量轉(zhuǎn)移的源能量盒子下標
????private?double?maxAmount;//?單次能量轉(zhuǎn)移最大單元
????private?int?DELAY?=?10;//?最大休眠時間(毫秒)
????volatile?boolean?keepRunning?=?true;
????private?int?count?=?0;
????public?EnergyTransferTask(EnergySystem?energySystem,?int?from,?double?max)?{
????????this.energySystem?=?energySystem;
????????this.fromBox?=?from;
????????this.maxAmount?=?max;
????}
????public?void?run()?{
????????try?{
????????????while?(keepRunning)?{
????????????????int?toBox?=?(int)?(energySystem.getBoxAmount()?*?Math.random());
????????????????double?amount?=?maxAmount?*?Math.random();
????????????????energySystem.transfer(fromBox,?toBox,?amount);
????????????????Thread.sleep((int)?(DELAY?*?Math.random()));
????????????????count++;
????????????????if(count?==?5){
????????????????????keepRunning?=?false;
????????????????}
????????????}
????????}?catch?(InterruptedException?e)?{
????????????e.printStackTrace();
????????}
????}
}

為了便于研究,將盒子數(shù)量BOX_AMOUNT改為2,但發(fā)現(xiàn)控制臺的輸出停止后,程序仍無法正常退出。推測是在wait set中線程一直在等待中,而其他線程已經(jīng)執(zhí)行完畢無法將其喚醒,有什么好的解決方法嗎?

http://img1.sycdn.imooc.com//561a69170001f90106040189.jpg


正在回答

3 回答

沒看到你別的代碼,也沒看這個題目,不知道具體問題, 但是就你出現(xiàn)的那個問題,notify是喚醒線程池中的任意一個線程,當你的讀和取都有多個線程時,有使用的同一個鎖,確實會造成死鎖,

JDK1.5?java.util.concurrent.locks?包中提供了更方便的靈活的解決辦法 ? ?

java.util.concurrent.locks包下 ? ?

Lock接口:代替了同步代碼塊或者同步函數(shù),將同步的隱式鎖操作變?yōu)榱孙@示操作,而已可以加上多個監(jiān)視器,

Condition接口中

signal();喚醒鎖上指定監(jiān)視器的一個線程 代替了notify()方法不會造成死鎖 ??


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

十分感謝樓上的同學指明方向,將synchronized同步機制改成ReentrantLock的lock機制,可以解決這個問題。

因此在EnergySystem類中聲明:

????private?final?ReentrantLock?lock?=?new?ReentrantLock();??
????private?Condition?notEnouge?=?lock.newCondition();??
????private?Condition?enouge?=?lock.newCondition();

并將該類中的synchronized塊改為:

????????lock.lock();??
????????try?{??
????????????while?(energyBoxes[from]?<?amount)?{?
????????????????notEnouge.await(1,?TimeUnit.SECONDS);//?wait();??
????????????}??
????????????System.out.print(Thread.currentThread().getName());
????????????energyBoxes[from]?-=?amount;
????????????System.out.printf("從%d轉(zhuǎn)移%10.2f單位能量到%d",?from,?amount,?to);
????????????energyBoxes[to]?+=?amount;
????????????System.out.printf("?能量總和:%10.2f%n",?getTotalEnergies());
????????????enouge.signalAll();//?notifyAll();
????????}?catch?(InterruptedException?e)?{??
????????????e.printStackTrace();??
????????}?finally?{??
????????????lock.unlock();??
????????}

這樣,等待中的線程每隔1秒就可重新爭取鎖,就不會陷入無限等待中。

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

發(fā)現(xiàn)有人這么說

wait?notify?可以被認為是過時的機制,自從concurrent包之后,不要再用?wait?notify?了,所以研究的意義可能也不大……要一個線程去等另一個線程,或者等某一個條件達成,concurrent包里有不好工具可以用,方法也不止一種(看情況用哪種),每一種都比?wait?notify?好。 ? ? ??

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

舉報

0/150
提交
取消

一直wait導致程序無法停止怎么解決?

我要回答 關(guān)注問題
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號