久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Java并發(fā)——線程中斷學(xué)習(xí)

 _王文波 2017-02-02

1. 使用interrupt中斷線程

當(dāng)一個(gè)線程運(yùn)行時(shí),另一個(gè)線程可以調(diào)用對(duì)應(yīng)的Thread對(duì)象的interrupt方法來(lái)中斷它,,該方法只是在目標(biāo)線程中設(shè)置一個(gè)標(biāo)志,,表示它已經(jīng)被中斷,,并立即返回。這里需要注意的是,如果只是單純的調(diào)用interrupt方法,,線程并沒有實(shí)際被中斷,,會(huì)繼續(xù)往下執(zhí)行。如下代碼所示:

public class SleepInterrupt implements Runnable { @Override public void run { try { System.out.println('子線程開始執(zhí)行'); Thread.sleep(20000); System.out.println('子線程繼續(xù)執(zhí)行'); } catch (InterruptedException e) { System.out.println('子線程遇到中斷異常'); //處理完中斷異常后,,返回到run方法入口 //如果沒有return,線程不會(huì)實(shí)際被中斷,,它會(huì)繼續(xù)打印下面的信息 return; } System.out.println('子線程執(zhí)行結(jié)束'); } public static void main(String args) { SleepInterrupt si = new SleepInterrupt; Thread t = new Thread(si); t.start; //主線程休眠2秒,從而確保剛才啟動(dòng)的線程有機(jī)會(huì)執(zhí)行一段時(shí)間 try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace; } System.out.println('主線程對(duì)子線程執(zhí)行中斷操作'); //中斷線程t t.interrupt; System.out.println('主線程結(jié)束執(zhí)行'); } }

主線程啟動(dòng)新線程后,,自身休眠2秒鐘,,允許新線程獲得運(yùn)行時(shí)間。新線程打印信息子線程開始執(zhí)行后,,繼而休眠20秒鐘,,大約2秒鐘后,main線程通知新線程中斷,,那么新線程的20秒的休眠將被打斷并拋出InterruptException異常,,執(zhí)行跳轉(zhuǎn)到catch塊,打印出子線程遇到中斷異常信息后結(jié)束,。

請(qǐng)注意:由于不確定的線程規(guī)劃,,上圖運(yùn)行結(jié)果的后兩行可能順序相反,這取決于主線程和新線程哪個(gè)先消亡,。但前兩行信息的順序必定如上圖所示,。

另外,如果將catch塊中的return語(yǔ)句注釋掉,,則線程在拋出異常后會(huì)繼續(xù)往下執(zhí)行,,而不會(huì)被中斷,從而會(huì)打印出子線程執(zhí)行結(jié)束信息,。

2. 待決中斷

在上面的例子中,,sleep方法的實(shí)現(xiàn)檢查到休眠線程被中斷,它會(huì)相當(dāng)友好地終止線程,,并拋出InterruptedException異常,。另外一種情況,如果線程在調(diào)用sleep方法前被中斷,,那么該中斷稱為待決中斷,,它會(huì)在剛調(diào)用sleep方法時(shí),立即拋出InterruptedException異常,。

public class PendingInterrupt extends Object { public static void main(String args) { //在main線程中中斷當(dāng)前線程(即main線程) Thread.currentThread.interrupt; //獲取當(dāng)前時(shí)間 long startTime = System.currentTimeMillis; try { Thread.sleep(2000); System.out.println('沒有被中斷'); } catch (InterruptedException e) { System.out.println('被中斷'); } //計(jì)算中間代碼執(zhí)行的時(shí)間 System.out.println('執(zhí)行耗時(shí)=' + (System.currentTimeMillis - startTime)); } }

這種模式下,,main線程中斷它自身。除了將中斷標(biāo)志(它是Thread的內(nèi)部標(biāo)志)設(shè)置為true外,,沒有其他任何影響,。線程被中斷了,,但main線程仍然運(yùn)行main線程繼續(xù)監(jiān)視實(shí)時(shí)時(shí)鐘并進(jìn)入try塊,,一旦調(diào)用sleep方法就會(huì)注意到待決中斷的存在,,并拋出InterruptException。于是執(zhí)行跳轉(zhuǎn)到catch塊,,并打印出線程被中斷的信息,。最后,計(jì)算并打印出時(shí)間差,。最終輸出的時(shí)間差距應(yīng)該遠(yuǎn)小于2000,。

3. 使用isInterrupted方法判斷中斷狀態(tài)

可以在Thread對(duì)象上調(diào)用isInterrupted方法來(lái)檢查任何線程的中斷狀態(tài)

這里需要注意:線程一旦被中斷isInterrupted方法便會(huì)返回true,,而一旦sleep方法拋出異常,,它將清空中斷標(biāo)志,此時(shí)isInterrupted方法將返回false,。下面的代碼演示了isInterrupted方法的使用:

public class InterruptCheck{ public static void main(String args) { Thread t = Thread.currentThread; System.out.println('Point A: t.isInterrupted=' + t.isInterrupted); //待決中斷,,中斷自身 t.interrupt; System.out.println('Point B: t.isInterrupted=' + t.isInterrupted); System.out.println('Point C: t.isInterrupted=' + t.isInterrupted); try { Thread.sleep(2000); System.out.println('was NOT interrupted'); } catch (InterruptedException e) { System.out.println('was interrupted'); } //跑出異常后,會(huì)清除中斷標(biāo)志,,這里會(huì)返回false System.out.println('Point D: t.isInterrupted=' + t.isInterrupted); } }

4. 使用Thread.interrupted方法判斷中斷狀態(tài)

可以使用Thread.interrupted方法來(lái)檢查當(dāng)前線程的中斷狀態(tài)(并隱式重置為false),。又由于它是靜態(tài)方法,因此不能在特定的線程上使用,,而只能報(bào)告調(diào)用它的線程的中斷狀態(tài),,如果線程被中斷,而且中斷狀態(tài)尚不清楚,,那么這個(gè)方法返回true,。isInterrupted不同,它將自動(dòng)重置中斷狀態(tài)為false,,第二次調(diào)用Thread.interrupted方法,,總是返回false,除非中斷了線程,。

如下代碼演示了Thread.interrupted方法的使用:

public class InterruptReset{ public static void main(String args) { System.out.println( 'Point X: Thread.interrupted=' + Thread.interrupted); Thread.currentThread.interrupt; System.out.println( 'Point Y: Thread.interrupted=' + Thread.interrupted); System.out.println( 'Point Z: Thread.interrupted=' + Thread.interrupted); } }

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多