一直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í)行完畢無法將其喚醒,有什么好的解決方法嗎?
2015-10-12
沒看到你別的代碼,也沒看這個題目,不知道具體問題, 但是就你出現(xiàn)的那個問題,notify是喚醒線程池中的任意一個線程,當你的讀和取都有多個線程時,有使用的同一個鎖,確實會造成死鎖,
JDK1.5?java.util.concurrent.locks?包中提供了更方便的靈活的解決辦法 ? ?
java.util.concurrent.locks包下 ? ?
Lock接口:代替了同步代碼塊或者同步函數(shù),將同步的隱式鎖操作變?yōu)榱孙@示操作,而已可以加上多個監(jiān)視器,
Condition接口中
signal();喚醒鎖上指定監(jiān)視器的一個線程 代替了notify()方法不會造成死鎖 ??
2015-10-12
十分感謝樓上的同學指明方向,將synchronized同步機制改成ReentrantLock的lock機制,可以解決這個問題。
因此在EnergySystem類中聲明:
并將該類中的synchronized塊改為:
這樣,等待中的線程每隔1秒就可重新爭取鎖,就不會陷入無限等待中。
2015-10-11
發(fā)現(xiàn)有人這么說