亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

淺談Java線程Thread之interrupt中斷解析

2024-07-13 10:17:29
字體:
來源:轉載
供稿:網友

這一篇我們說說java/179523.html">Java線程Thread的interrupt中斷機制。

中斷線程

線程的thread.interrupt()方法是中斷線程,將會設置該線程的中斷狀態位,即設置為true,中斷的結果線程是死亡、還是等待新的任務或是繼續運行至下一步,就取決于這個程序本身。線程會不時地檢測這個中斷標示位,以判斷線程是否應該被中斷(中斷標示值是否為true)。它并不像stop方法那樣會中斷一個正在運行的線程。

判斷線程是否被中斷

判斷某個線程是否已被發送過中斷請求,請使用Thread.currentThread().isInterrupted()方法(因為它將線程中斷標示位設置為true后,不會立刻清除中斷標示位,即不會將中斷標設置為false),而不要使用thread.interrupted()(該方法調用后會將中斷標示位清除,即重新設置為false)方法來判斷,下面是線程在循環中時的中斷方式:

while(!Thread.currentThread().isInterrupted() && more work to do){ do more work}

interrupt之中斷狀態標記

interrupt中斷機制中有如下方法:

  1. Thread.interrupt(),設置當前中斷標記為true(類似屬性的set方法)
  2. Thread.isInterrupted(),檢測當前的中斷標記(類似屬性的get方法)
  3. Thread.interrupted(),檢測當前的中斷標記,然后重置中斷標記為false(類似屬性的get方法+set方法)

因此interrupt中斷機制并不是真正的將當前線程中斷,而是一個中斷標記的變化。我們先用例子來測試一下。

public class InterruptTest { //這里用來打印消耗的時間 private static long time = 0; private static void resetTime(){ time = System.currentTimeMillis(); } private static void printContent(String content){ System.out.println(content + "  時間:" + (System.currentTimeMillis() - time)); } public static void main(String[] args) { test1(); } private static void test1(){ Thread1 thread1 = new Thread1(); thread1.start(); //延時3秒后interrupt中斷 try {  Thread.sleep(3000); } catch (InterruptedException e) {  e.printStackTrace(); } thread1.interrupt(); printContent("執行中斷"); } private static class Thread1 extends Thread{ @Override public void run() {  resetTime();  int num = 0;  while (true){  if(isInterrupted()){   printContent("當前線程 isInterrupted");   break;  }  num++;  if(num % 100 == 0){   printContent("num : " + num);  }  } } }}

以上代碼是開啟一個Thread1線程,在Thread1線程的while循環中不斷對num加1,每到100的倍數打印一次(防止打印太快)。然后主線程在sleep了3000毫秒后,調用Thread1線程的interrupt方法。那么我們看看輸出結果:

Java線程,Thread,中斷,java,線程interrupt,interrupt

intterupt中斷

可以看到,在耗時3000毫秒左右,也就是主線程sleep之后執行thread1.interrupt();后,Thread1線程停止了,而Thread1線程的停止是因為while循環中的isInterrupted方法返回了true,所以break退出了while循環,也就是說interrupt和isInterrupted在這里起到的作用就相當于setXX和getXX的作用,維護著一個boolean變量。

interrupt之中斷異常處理

當然interrupt機制并不僅僅是一個中斷狀態位的變化和檢測,它還可以進行中斷異常的處理。我們知道Thread.sleep()方法需要捕獲中斷異常,那接下來我們往其中添加一個sleep延時試試

 while (true){ if(isInterrupted()){  printContent("當前線程 isInterrupted");  break; } num++;  //sleep一下 try {  Thread.sleep(1); } catch (InterruptedException e) {  e.printStackTrace(); } if(num % 100 == 0){  printContent("num : " + num); } }

我們再看看輸出結果:

Java線程,Thread,中斷,java,線程interrupt,interrupt

intterupt中斷

這里我們會發現,sleep睡眠之后,輸出的num值明顯小了好多(沒睡眠時num都達到10億的大小了,看來CPU執行簡單運算還是非常快的),哈哈,不過這不是重點,重點是是看到輸出了一個異常,還有就是輸出異常后,isInterrupted輸出返回false,Thread1線程又繼續執行下去了,并沒有退出while循環。那么這是為什么呢?我們只是加了一個sleep睡眠而已。

如果Thread1線程中有執行需要捕獲InterruptedException異常的操作,比如Thread的sleep,join方法,Object的wait,Condition的await等,它是強制需要捕獲InterruptedException異常的,那么當thread1.interrupt方法調用之后,它會給thread1線程拋出一個InterruptedException異常,那么在while循環中,就能捕獲到這個異常然后這個異常拋出之后,又會馬上將線程中斷標識重置為false,因此在下次的while循環中判斷isInterrupted時,它是false,也就不會break,然后while循環會一直執行下去。

因此interrupt()方法會根據thread線程中的run方法里是否有必須捕獲InterruptedException異常的代碼,而做出不同操作:

  1. 如果沒有必須捕獲InterruptedException異常的代碼(比如Thread.sleep()),則isInterrupted()會返回true,此時可以在isInterrupted的判斷中處理中斷變化。
  2. 如果有必須捕獲InterruptedException異常的代碼(比如Thread.sleep()),則會拋出InterruptedException異常,并進行捕獲,同時重置isInterrupted為false,此時得在異常捕獲中處理中斷變化。

interrupt的應用場景

通常interrupt適用于在線程執行中的循環標記判斷,例如

while(!isInterrupted()){ ...}

但是如果在本次循環中出現阻塞了,那么線程就無法判斷下次的isInterrupted標記,那么即便調用了interrupt()方法也無法退出循環,也就無法退出線程。例如

while(!isInterrupted()){ ...  while(true){  //線程卡在這里了,則無法響應interrupte機制了 }}

這樣的話,interrupt就沒轍了,線程會一直執行下去,不會被中斷停止。

測試例子查看 我的GitHub--JavaTest

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
自拍亚洲一区欧美另类| 亚洲成年网站在线观看| 欧洲成人免费aa| 欧美极品美女视频网站在线观看免费| 日韩在线视频国产| 中文字幕日韩av电影| 热99精品只有里视频精品| 亚州国产精品久久久| 国产成人jvid在线播放| 九九九热精品免费视频观看网站| 成人国产精品av| 日韩大片在线观看视频| 成人中文字幕+乱码+中文字幕| 中文字幕免费国产精品| 黑人精品xxx一区一二区| 欧美一级大片在线免费观看| 亚洲白虎美女被爆操| 欧美性生交xxxxx久久久| 一夜七次郎国产精品亚洲| 欧美日韩亚洲一区二区| 日韩欧美aⅴ综合网站发布| 亚洲一区二区日本| 中文字幕日本欧美| 日韩第一页在线| 久久九九精品99国产精品| 免费91麻豆精品国产自产在线观看| 久久久国产精品免费| 久久久电影免费观看完整版| 国产精品一区二区女厕厕| 亚洲美女久久久| 在线亚洲欧美视频| 91网在线免费观看| 美女啪啪无遮挡免费久久网站| 欧美激情xxxxx| 国产精品免费久久久| 啊v视频在线一区二区三区| 国产亚洲激情在线| 久久久久久久久国产| 久久福利视频网| 午夜精品久久久久久99热| 国产精品丝袜久久久久久高清| 欧美激情免费在线| 国产综合久久久久久| 欧美精品一区三区| 亚洲一区二区在线播放| 国产一区深夜福利| 国内自拍欧美激情| 国产91成人video| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲女人初尝黑人巨大| 日本韩国欧美精品大片卡二| 青草青草久热精品视频在线观看| 久久久国产影院| 日韩精品久久久久久福利| 亚洲精品98久久久久久中文字幕| 最新国产精品拍自在线播放| 欧美日韩国产麻豆| 国产99在线|中文| 中文字幕亚洲图片| 欧美高清性猛交| 精品视频在线播放| 一区二区三区美女xx视频| 亚洲丝袜av一区| 国产精品678| 亚洲午夜精品久久久久久久久久久久| 97精品一区二区三区| 国产午夜精品美女视频明星a级| 亚洲性av在线| 国产精品99蜜臀久久不卡二区| 一区二区三区无码高清视频| 国产精品女主播| 久久综合久中文字幕青草| 国产视频亚洲精品| 日韩av成人在线| 亚洲国产精品福利| 性色av一区二区三区红粉影视| 欧美老女人在线视频| 成人免费网站在线观看| 日韩av中文字幕在线免费观看| 亚洲欧美激情在线视频| 成人网在线视频| 成人字幕网zmw| 国产精品视频区1| 91欧美激情另类亚洲| 国产成人精品久久亚洲高清不卡| 亚洲乱亚洲乱妇无码| 久久不射电影网| 日本高清+成人网在线观看| 久久成人精品一区二区三区| 久久久久国产精品免费网站| 亚洲精品按摩视频| 国产69精品久久久久99| 亚洲欧美国产另类| 国产精品视频区1| 美女久久久久久久| 久久精品国产亚洲精品| 国产亚洲精品一区二555| 中文字幕日韩av综合精品| 欧美高清激情视频| 91精品国产自产在线老师啪| 在线播放日韩精品| 亚洲白拍色综合图区| 国产精品免费在线免费| 国产精品你懂得| 国产亚洲精品美女久久久| 久久综合免费视频影院| 亚洲性av在线| 国产精品久久久久久久久久ktv| 日韩国产高清视频在线| 欧美日韩一区二区在线播放| 国产日韩在线播放| 国产精品成人一区二区| 最近2019年手机中文字幕| 久久av中文字幕| 日韩在线视频国产| 欧美视频专区一二在线观看| 国产a级全部精品| 国产亚洲一区二区精品| 亚洲男人天堂手机在线| 欧美激情亚洲一区| 久久久91精品国产一区不卡| www.亚洲天堂| 国产精品丝袜久久久久久不卡| 欧美成人午夜影院| 琪琪第一精品导航| 国产成一区二区| 91免费视频国产| 中文字幕欧美视频在线| 中文字幕在线看视频国产欧美| 国产精品女人久久久久久| 亚洲精品国偷自产在线99热| 欧美精品在线网站| 伊人久久精品视频| www国产91| 日韩av电影手机在线观看| 懂色av中文一区二区三区天美| 欧美性xxxxx极品| 永久免费毛片在线播放不卡| 亚洲美女动态图120秒| 国产精品黄色av| 91免费看片在线| 欧美亚洲另类制服自拍| 一区二区三区天堂av| 亚洲高清久久久久久| 国内精品久久久久影院 日本资源| 久久天天躁狠狠躁夜夜爽蜜月| 另类色图亚洲色图| 欧美国产日韩一区二区三区| 国语自产偷拍精品视频偷| 亚洲欧洲黄色网| 中文字幕欧美日韩精品| 97精品国产97久久久久久免费| 一区二区成人av| 欧美成人精品在线| 日韩一区二区三区在线播放| 中日韩午夜理伦电影免费| 欧美成人精品三级在线观看| 亚洲人成免费电影| 欧美电影电视剧在线观看| 97在线视频免费播放| 91精品视频在线播放| 97成人精品视频在线观看| 国产精品久久久久一区二区| 国产97人人超碰caoprom|