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

首頁 > 學院 > 開發設計 > 正文

怎樣處理InterruptedException

2019-11-14 15:03:37
字體:
來源:轉載
供稿:網友

java 中的受檢查異常 InterruptedException 如何處理是令人頭痛的問題,下面是我對處理這個問題的理解。

Java 中的 InterruptedException 一直是一個令人頭疼的問題,對初級開發者來說尤其如此。但實際上不應如此,這其實是一個很容易理解的問題。我會盡可能簡單地描述這個問題。

我們從這段代碼開始:

1
2
3
while (true) {
  // Nothing
}

它做了什么?什么都沒做,只是無止境的消耗 CPU。我們能終止它嗎?在 Java 中是不行的。只有當你按下 Ctrl-C 來終止整個 JVM 時這段程序才會停止。在 Java 中沒有方式來終止一個線程,除非該線程自動退出。請務必牢記的這一原則,其它東西就顯而易見了。

我們將這個死循環放在一個線程里:

1
2
3
4
5
6
7
8
9
10
11
Thread loop = new Thread(
  new Runnable() {
    @Override
    public void run() {
      while (true) {
      }
    }
  }
);
loop.start();
// Now how do we stop it?

所以,怎樣才能停止一個需要停止的線程?

下面是 Java 中設計終止一個線程的方法。在線程的外部,設置一個標識變量(flag),然后在線程內部檢查改標識變量,從而實現線程的終止。過程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Thread loop = new Thread(
  new Runnable() {
    @Override
    public void run() {
      while (true) {
        if (Thread.interrupted()) {
          break;
        }
        // Continue to do nothing
      }
    }
  }
);
loop.start();
loop.interrupt();

這是終止線程的唯一方式,在這個例子里使用了兩個方法。當調用 loop.interrupt() ,線程內部將標志位設置為 true。當調用 interrupted() 時,立即返回,并將標識變量設置為 false。確實,這個方法就是這樣設計的。檢查標識變量、返回、設置為 false。我知道這很丑陋。

因此,我從來沒有在線程內調用 Thread.interrupted() 方法,因此標識變量為 true 時線程不會退出,沒有人能停止這個線程。準確地說,我會忽略他們對 interrupt() 方法的調用。雖然它們會要求終止線程,但是我會忽略它們。它們不能讓線程中斷。

因此,總結一下我們現在理解的內容,一種合理的設計是通過檢查標識變量來優雅地終止線程。如果代碼中不檢測標識變量,也不調用 Thread.interrupted(),那么終止線程的方式就只能按下 Ctrl-C 了。

現在你聽明白這個邏輯了嗎?我希望是。

現在,JDK 中有一些方法來檢測標識變量,如果設置該標識變量,則會拋出 InterruptedException。例如,Thread.sleep() 方法的設計(一種最基本的方法):

1
2
3
4
5
6
7
8
9
public static void sleep(long millis)
  throws InterruptedException {
  while (/* You still need to wait */) {
    if (Thread.interrupted()) {
      throw new InterruptedException();
    }
    // Keep waiting
  }
}

為什么要這么做?為什么不能等待并且不用去檢查標識變量?我相信一定有一個非常好的理由。理由如下(如果我說錯了,請修正我的錯誤):為了讓代碼變快或是中斷準備,沒有其他理由。

如果你的代碼足夠快,你從來不會檢測中斷標識變量,因為你不想處理任何中斷。如果你代碼很慢,可能需要執行數秒,這時你就有可能需要處理中斷了。

這就是為什么 InterruptedException 是受檢查異常。這種設計告訴你,如果你想在幾毫秒內停止線程,確定你已經做好中斷準備。實踐中一般做如下處理:

1
2
3
4
5
try {
  Thread.sleep(100);
} catch (InterruptedException ex) {
  // Stop immediately and go home
}

現在,你可以將它拋給負責捕獲該異常的上級程序去處理。這種觀點是有人在使用線程,并且會捕獲該異常。理想情況下,會終止線程,因為這就是標識變量的功能。如果拋出 InterruptedException,就意味著有人在檢查標識變量,線程需要盡可能快地終止。

線程的擁有者不想再等待線程執行,我們應該尊重擁有者的決定。

因此,當捕獲到 InterruptedException 時,你應該完成相關的操作再退出線程。

現在,我們再看一下 Thread.sleep() 的代碼:

1
2
3
4
5
6
7
8
public static void sleep(long millis)
  throws InterruptedException {
  while (/* ... */) {
    if (Thread.interrupted()) {
      throw new InterruptedException();
    }
  }
}

請記住,Thread.interrupted() 不僅僅是返回標識變量的值,而且會將標識變量的值設置為 false。因此,一旦拋出 InterruptedException 異常,標志變量將會重置。線程不再收到任何擁有者發送的中斷請求。

線程的所有者要求停止線程,Thread.sleep() 監測到該請求并將其刪除,再拋出 InterruptedException。如果你再次調用 Thread.sleep(),就不會響應任何中斷請求,也不會拋出任何異常。

知道我想要說的是什么嗎?不要丟失 InterruptedException,這一點非常重要。我們不能吞噬該異常并繼續運行。這嚴重違背了 Java 多線程原則。所有者(線程的所有者)要求停止線程,而我們卻將其忽略,這是非常不好的想法。

下面是大多數人對 InterruptedException 的處理:

1
2
3
4
5
try {
  Thread.sleep(100);
} catch (InterruptedException ex) {
  throw new RuntimeException(ex);
}

這看起來是符合邏輯的,但是這不能保證上層程序真正停止并退出。上層可能捕獲了運行時異常,所以這個線程還是存活的。線程所有者將會非常失望。

我們必須通知上層捕獲了一個中斷請求。我們不能只拋出運行時異常,這種行為太不負責了。當一個線程接收一個中斷請求時,我們不能只是將其轉換成為一個 RuntimeException。我們不能將這種嚴峻的情況如此輕松地對待。

這是我們應該做的:

1
2
3
4
5
6
try {
  Thread.sleep(100);
} catch (InterruptedException ex) {
  Thread.currentThread().interrupt(); // Here!
  throw new RuntimeException(ex);
}

我們需要將標識變量重新設置為 true。

現在,沒有人會譴責我們以不負責的態度來處理標識變量。我們發現其狀態為 true,將其清理,重新設置為 true,最后拋出運行時異常。接下來會發生什么?我們已經不關心了。

這就是我認為的處理方式。你可以找到這個問題更詳細的官方描述:Java 理論與實踐:InterruptedException 處理

原文鏈接: https://dzone.com/articles/how-to-handle-the-interruptedexception 翻譯:ImportNew.com - paddx
譯文鏈接: http://www.importnew.com/17027.html

 

全能程序員交流QQ群290551701,聚集很多互聯網精英,技術總監,架構師,項目經理!開源技術研究,歡迎業內人士,大牛及新手有志于從事IT行業人員進入!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品偷伦免费视频观看的| 欧美天天综合色影久久精品| 欧美视频免费在线观看| 亚洲精品日韩激情在线电影| 亚洲香蕉伊综合在人在线视看| 久久伊人精品一区二区三区| 久久夜精品香蕉| 精品免费在线视频| 亚洲精品98久久久久久中文字幕| 日韩欧美在线国产| 欧美日韩高清区| 国产99在线|中文| 成人亚洲综合色就1024| 国产精品三级美女白浆呻吟| 亚洲男人天堂2019| www.欧美免费| 永久免费看mv网站入口亚洲| 中文字幕综合一区| 少妇高潮久久77777| 亚洲欧洲黄色网| 国产精品入口日韩视频大尺度| 久久精品国产一区二区电影| 日韩黄色av网站| 在线免费观看羞羞视频一区二区| 不卡在线观看电视剧完整版| 57pao国产精品一区| 欧美一性一乱一交一视频| 国产性猛交xxxx免费看久久| 欧美精品久久久久久久久久| 日韩av手机在线看| 91国在线精品国内播放| 国产精品久久久久免费a∨大胸| 日韩在线观看精品| 日韩大片在线观看视频| 亚洲成avwww人| 国产精品视频精品视频| www.欧美精品| 国产精品毛片a∨一区二区三区|国| 亚洲va久久久噜噜噜久久天堂| 国外色69视频在线观看| 久久久午夜视频| 国产视频久久久| 97久久伊人激情网| 国产精品久久久久77777| 久久免费高清视频| 亚洲福利视频久久| 久久手机免费视频| 欧美肥婆姓交大片| 国产丝袜精品第一页| 亚洲成人精品视频在线观看| 九九热最新视频//这里只有精品| 欧美亚洲成人网| 日韩精品在线视频美女| 欧美大片免费观看在线观看网站推荐| 伊人伊成久久人综合网小说| 午夜精品99久久免费| 色婷婷成人综合| 久久91精品国产91久久久| 欧美激情视频在线免费观看 欧美视频免费一| 九色精品免费永久在线| 国产一区二区成人| 国产成人一区二区三区| 日韩福利视频在线观看| 亚洲xxx视频| 欧美黑人巨大xxx极品| 亚洲欧美国产一本综合首页| 亚洲丁香久久久| 欧美日韩高清在线观看| 亚洲精品suv精品一区二区| 欧美日韩国产色| 91精品在线影院| 亚洲自拍另类欧美丝袜| 亚洲japanese制服美女| 亚洲视频国产视频| 亚洲 日韩 国产第一| 成人免费黄色网| 久久精品视频亚洲| 国产精品91在线| 欧美国产精品va在线观看| 亚洲成人av资源网| 美女国内精品自产拍在线播放| 最新的欧美黄色| 亚洲欧美在线一区| 久久久久久欧美| 亚洲区中文字幕| 国产精品久久久久久久久久久久久| 91国产精品视频在线| 欧美激情视频在线观看| 欧美剧在线观看| 国产精品电影在线观看| 一区二区欧美在线| 色婷婷**av毛片一区| 亚洲韩国日本中文字幕| 疯狂蹂躏欧美一区二区精品| 国语自产精品视频在线看抢先版图片| 日韩精品视频中文在线观看| 国产精品色午夜在线观看| 久久夜精品va视频免费观看| 91精品国产91久久久久久| 亚洲视频视频在线| 亚洲成人动漫在线播放| 国产成人亚洲综合| 免费91在线视频| 欧美精品在线免费| 亚洲精品欧美日韩专区| 黄色91在线观看| 欧美成人第一页| 亚洲性av在线| 久久久免费精品| 亚洲欧洲一区二区三区在线观看| 久久久亚洲国产| 国产69久久精品成人| 亚洲色图第一页| 日韩国产欧美区| 亚洲精品狠狠操| 欧美亚洲国产视频小说| 国产精品青青在线观看爽香蕉| 日韩欧美精品免费在线| 色777狠狠综合秋免鲁丝| 国产一区二区三区在线| 国模gogo一区二区大胆私拍| 欧美一区二粉嫩精品国产一线天| 欧美色另类天堂2015| 欧美大成色www永久网站婷| 亚洲午夜精品久久久久久久久久久久| 91美女片黄在线观看游戏| 国产日本欧美视频| 人人澡人人澡人人看欧美| 国产精品激情自拍| 日本高清久久天堂| 中文字幕无线精品亚洲乱码一区| 精品视频在线播放色网色视频| 国产在线精品播放| 最近2019中文字幕mv免费看| 亚洲欧美日韩国产中文专区| 日本久久久久久久久| 国产成人精品久久二区二区91| 亚洲人成毛片在线播放| 欧美日韩日本国产| 国产精品成人观看视频国产奇米| 中文字幕综合一区| 国产亚洲精品久久久| 成人日韩av在线| 国产精品福利在线| 亚洲国产精品va在线看黑人动漫| 国产精品人成电影在线观看| 国产日韩欧美视频| 精品视频久久久| 91免费版网站入口| 国产精品福利网| 中文字幕免费国产精品| 国产精品自拍网| 欧美日韩美女在线| 久久全球大尺度高清视频| 国产精品丝袜一区二区三区| 国产日韩在线看片| 国产亚洲精品久久久久久| 亚洲人成在线观看网站高清| 中文字幕一区二区精品| 黄色91在线观看| 少妇高潮 亚洲精品| 日韩国产欧美区| 精品少妇一区二区30p| 精品偷拍一区二区三区在线看|