資源描述:
《java并發(fā)編程(2):線程中斷(含代碼)-編程開發(fā)技術(shù)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、Java并發(fā)編程(2):線程中斷(含代碼)-編程開發(fā)技術(shù)Java并發(fā)編程(2):線程中斷(含代碼)原文出處:蘭亭風(fēng)雨使用interrupt()中斷線程當(dāng)一個線程運行時,另一個線程可以調(diào)用對應(yīng)的Thread對象的interrupt()方法來中斷它,該方法只是在目標(biāo)線程中設(shè)置一個標(biāo)志,表示它已經(jīng)被中斷,并立即返回。這里需要注意的是,如果只是單純的調(diào)用interrupt()方法,線程并沒有實際被中斷,會繼續(xù)往下執(zhí)行。卜?面一段代碼演示了休眠線程的中斷:publicclassSleepInterruptextendsObjectimplementsRunnable{pub
2、licvoidrun(){try{System.out.printin(^inrun()-abouttosleepfor20seconds");Thread,sleep(20000);System.out.println(〃inrun()-wokeup〃);}catch(InterruptedExceptione){System.out.printin("inrun()-interruptedwhilesleeping");//處理完中斷異常后,返回到run()方法人口,//如果沒有return,線程不會實際被中斷,它會繼續(xù)打印下面的信息return;}Syste
3、m?out.printin("inrun()一leavingnormally");}publicstaticvoidmain(String[]args){Sleepinterruptsi=newSleepinterrupt();Threadt=newThread(si);t.start();//主線程休眠2秒,從而確保剛才啟動的線程有機會執(zhí)行一段吋間try{Thread.sleep(2000);}catch(InterruptedExceptione){e.printStackTrace();System,out.printin(/zinmain()-interr
4、uptingotherthread");//中斷線程tt.interrupt();}}System,out.println(〃inmain()-leaving");運行結(jié)果如下:二C:TIID0TSsystea32cBd.ezeF:thread>jauacSleeplnterrupt.jauaF:tbread>jauaSleeplnterruptinrun<>一abouttosleepfor20secondsinnainO一interruptingotherthreadinnainO一leavinginrun<>一interruptedwhileslee
5、pingF:thread>搜狗拼音半:???主線程啟動新線程后,自身休眠2秒鐘,允許新線程獲得運行時間。新線程打印信息"abouttosleepfor20seconds"后,繼而休眠20秒鐘,大約2秒鐘后,main線程通知新線程中斷,那么新線程的20秒的休眠將被打斷,從而拋岀InteiruptException界常,執(zhí)行跳轉(zhuǎn)到catch塊,打印出“interruptedwhilesleeping”信息,并立即從run()方法返回,然后消亡,而不會打印出catch塊后面的“l(fā)eavingnormally^^信息。???請注意:由于不確定的線程規(guī)劃,上圖運行結(jié)果的后
6、兩行可能順序相反,這取決于主線程和新線程哪個先消亡。但前兩行信息的順序必定如上圖所示。??另外,如果將catch塊中的return語句注釋掉,貝U線程在拋出異常后,會繼續(xù)往下執(zhí)行,而不會被中斷,從而會打印出"leavingnormally“信息。待決中斷在上面的例了中,sleep()方法的實現(xiàn)檢杳到休眠線程被中斷,它會相當(dāng)友好地終止線程,并拋出InterruptedException異常。另外一種情況,如果線程在調(diào)用sleep()方法前被中斷,那么該中斷稱為待決中斷,它會在剛調(diào)用sleep()方法吋,立即拋LbInterruptedException異常。下面的代
7、碼演示了待決中斷:publicclassPcndinglntcrruptcxtcndsObject{publicstaticvoidmain(String[]args){線程)//如果輸入了參數(shù),則在mian線程中中斷當(dāng)前線程(亦即mainif(args,length>0){Thread,currcntThrcad().intcrrupt();}//獲取當(dāng)前時間longstartTime二System,currentTimeM訂lis();try{Thread,sleep(2000);System.out?printin(zzwasNOTinterrupted")
8、;}cat