課程
/后端開發(fā)
/Java
/深入淺出Java多線程
我按照視頻中的代碼重寫了一編,發(fā)現(xiàn)在運(yùn)行時(shí)經(jīng)常會(huì)不出數(shù)據(jù),但是程序還沒子啊運(yùn)行,是不是死鎖
2016-07-29
源自:深入淺出Java多線程 4-3
正在回答
這個(gè)設(shè)置了,這是我的代碼,我跟視頻上不完全一樣,一個(gè)是測(cè)試,一個(gè)thread,謝謝了
package?project_thread; public?class?EnergyThread?extends?Thread?{ private?final?double[]?energy_box; private?double?energy_max; private?Object?lock=new?Object(); ?????@Override ????public?void?run()?{ ???? //?TODO?Auto-generated?method?stub ???? ???? ?while?(true)?{ int?from=(int)?(Math.random()*getlength()); int?to?=(int)?(Math.random()*getlength()); double?energy=Math.random()*energy_max; int?time=(int)?(Math.random()*50); energy_tansform(from,?to,?energy); try?{ sleep(time); }?catch?(InterruptedException?e)?{ //?TODO?Auto-generated?catch?block e.printStackTrace(); } } ????} ?????public?EnergyThread(double?energy_initial,int??n)?{ //?TODO?Auto-generated?constructor?stub ???? ?this.energy_box=new?double[n]; ???? ?this.energy_max=energy_initial; ???? ?for?(int?i?=?0;?i?<?n;?i++)?{ energy_box[i]=energy_initial; } } ????? ?????public?int?getenergy_total()?{ ???? ?double?total=0; ???? ?for?(double?d?:?energy_box)?{ total+=d; } return?(int)total; } ????? ?????public?void?energy_tansform(int?from,int?to?,double?energy)?{ synchronized?(lock)?{ if(energy_box[from]<energy){ try?{ lock.wait(); }?catch?(InterruptedException?e)?{ //?TODO?Auto-generated?catch?block e.printStackTrace(); } } energy_box[from]-=energy; energy_box[to]+=energy; System.out.println(getName()+":energy_box["+from+"]向energy_box["+to+"]轉(zhuǎn)移"+energy+"energy_total="+getenergy_total()); lock.notifyAll(); } } ????? ?????public?int??getlength()?{ return?energy_box.length; } }
package?project_thread; public?class?ThreadTest?{ public?static?void?main(String[]?args)?{ //?TODO?Auto-generated?method?stub ???????? ?????????for(int?i=0;i<100;i++){ ???????? ?Thread?thread=new?EnergyThread(1000,100); ???????? ?thread.start(); ?????????} ???????? } }
對(duì)著視頻再檢查一下吧,
你看一下run方法里的amount有沒有寫對(duì),double amount=maxAmount*Math.random();
transfer的時(shí)候amout必須滿足amount<=amxAmount,不然就會(huì)造成死鎖
小不點(diǎn)2016 提問者
SilenceDean 回復(fù) 小不點(diǎn)2016 提問者
舉報(bào)
帶你一起深入淺出多線程,掌握基礎(chǔ),展望進(jìn)階路線
2 回答貌似上鎖之后還是會(huì)不守恒
1 回答為什么我的能量不守恒呢
1 回答到底什么是爭(zhēng)用條件?為什么能量會(huì)不守恒
4 回答為啥老師的程序在我的機(jī)器上跑能量是守恒的
1 回答在4-1節(jié)中跟著視頻代碼敲,最后運(yùn)行結(jié)果一直是守恒的,總量都是100000,這是為什么?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購(gòu)課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2016-07-31
這個(gè)設(shè)置了,這是我的代碼,我跟視頻上不完全一樣,一個(gè)是測(cè)試,一個(gè)thread,謝謝了
2016-07-30
對(duì)著視頻再檢查一下吧,
你看一下run方法里的amount有沒有寫對(duì),double amount=maxAmount*Math.random();
transfer的時(shí)候amout必須滿足amount<=amxAmount,不然就會(huì)造成死鎖