java并發(fā)編程(3):線程掛起、恢復與終止的正確方法(含代碼)-編程開發(fā)技術

java并發(fā)編程(3):線程掛起、恢復與終止的正確方法(含代碼)-編程開發(fā)技術

ID:30768944

大小:482.50 KB

頁數(shù):9頁

時間:2019-01-03

java并發(fā)編程(3):線程掛起、恢復與終止的正確方法(含代碼)-編程開發(fā)技術_第1頁
java并發(fā)編程(3):線程掛起、恢復與終止的正確方法(含代碼)-編程開發(fā)技術_第2頁
java并發(fā)編程(3):線程掛起、恢復與終止的正確方法(含代碼)-編程開發(fā)技術_第3頁
java并發(fā)編程(3):線程掛起、恢復與終止的正確方法(含代碼)-編程開發(fā)技術_第4頁
java并發(fā)編程(3):線程掛起、恢復與終止的正確方法(含代碼)-編程開發(fā)技術_第5頁
資源描述:

《java并發(fā)編程(3):線程掛起、恢復與終止的正確方法(含代碼)-編程開發(fā)技術》由會員上傳分享,免費在線閱讀,更多相關內容在工程資料-天天文庫

1、hva并發(fā)編程(3):線程掛起、恢復與終止的正確方法(含代碼)-編程開發(fā)技術Java并發(fā)編程(3):線程掛起、恢復與終止的正確方法(含代碼)原文出處:蘭亭風雨掛起和恢復線程???Thread的API中包含兩個被淘汰的方法,它們用于臨吋掛起和重啟某個線程,這些方法已經(jīng)被淘汰,因為它們是不安全的,不穩(wěn)定的。如果在不合適的時候掛起線程(比如,鎖定共享資源時),此時便可能會發(fā)生死鎖條件一一其他線程在等待該線程釋放鎖,但該線程卻被掛起了,便會發(fā)生死鎖。另外,在長時間計算期間掛起線程也可能導致問題。下面的代碼演示了通過休眠來延緩運行,模擬長吋間運行的情況,使線程更可能在不適

2、當?shù)臅r候被掛起:publicclassDcprccatcdSuspcndRcsumccxtcndsObjcctimplementsRunnable{//volatile關鍵字,表示該變量可能在被一個線程使用的同時,被另一個線程修改privatevolatileintfirstVal;privatevolat訂cintsecondVal;//判斷二者是否相等publicbooleanareValuesEqual(){return(firstVal二二secondVal);}publicvoidrun(){try{firstVal二0;secondVal二0;wor

3、kMethodO;}catch(InterruptedExceptionx){System,out.println(〃interruptedwhileinworkMethod()“);}privatevoidworkMethod()throwsInterruptedException{intval=1;while(true){stepOne(val);stepTwo(val);val++;Thread,sleep(200);//再次循環(huán)錢休眠200毫秒//賦值后,休眠300毫秒,從而使線程有機會在stepOne操作和stcpTwo操作之間被掛起privatevo

4、idstepOne(intnewVal)throwsInterruptedException{firstVal=newVal;Thread,sleep(300);//模擬長吋間運行的情況}privatevoidstepTwo(intnewVal){secondVal=newVal;}publicstaticvoidmain(String[]args){DeprecatedSuspendResumedsr=newDeprecatedSuspendResume();Threadt二newThread(dsr);t.start();//休眠1秒,讓其他線程冇機會獲得執(zhí)

5、行try{Thread.sleep(1000);}catch(TnterruptedExceptionx){}for(inti=0;i<10;i++){〃掛起線程t.suspend();System,out.printin(,zdsr.areValuesEqual()二〃+dsr.areValuesEqual());〃恢復線程t.resume();try{//線程隨機休眠o?2秒Thread,sleep((long)(Math,random()*2000.0));}catch(InterruptedExceptionx){//略System,exit(0);//

6、中斷應用程序某次運行結果如下:從areValuesEqual()返回的值有時為true,冇時為false。以上代碼中,在設置firstVal之后,但在設置secondVal之前,掛起新線程會產(chǎn)生麻煩,此時輸出的結果會為false(情況1),這段吋間不適宜掛起線程,但因為線程不能控制何時調用它的suspend方法,所以這種情況是不可避免的。當然,即使線程不被掛起(注釋掉掛起和恢復線程的兩行代碼),如果在main線程中執(zhí)asr.areValuesEqual()進行比較時,恰逢stepOne操作執(zhí)行完,而stepTwo操作還沒執(zhí)行,那么得到的結果同樣可能是false(

7、情況2)。下面我們給岀不用上述兩個方法來實現(xiàn)線程掛起和恢復的策略一一設置標志位。通過該方法實現(xiàn)線程的掛起和恢復有一個很好的地方,就是可以在線程的指定位置實現(xiàn)線程的掛起和恢復,而不用擔心其不確定性。對于上述代碼的改進代碼如下:publicclassAlternateSuspendResumeextendsObjectimplementsRunnableprivatevolatileintfirstVal;privatevolatileintsecondVal;//增加標志位,用來實現(xiàn)線程的掛起和恢復privatcvolat訂cbooleansuspended;pu

8、blicbooleana

當前文檔最多預覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學公式或PPT動畫的文件,查看預覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內容,確認文檔內容符合您的需求后進行下載,若出現(xiàn)內容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。