成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我們該如何正確的中斷一個正在執行的線程??

網絡 通信技術
作者個人研發的在高并發場景下,提供的簡單、穩定、可擴展的延遲消息隊列框架,具有精準的定時任務和延遲隊列處理功能。

[[358852]]

作者個人研發的在高并發場景下,提供的簡單、穩定、可擴展的延遲消息隊列框架,具有精準的定時任務和延遲隊列處理功能。自開源半年多以來,已成功為十幾家中小型企業提供了精準定時調度方案,經受住了生產環境的考驗。為使更多童鞋受益,現給出開源框架地址:https://github.com/sunshinelyz/mykit-delay

 寫在前面

當我們在調用Java對象的wait()方法或者線程的sleep()方法時,需要捕獲并處理InterruptedException異常。如果我們對InterruptedException異常處理不當,則會發生我們意想不到的后果!今天,我們就以一個案例的形式,來為大家詳細介紹下為何中斷執行的線程不起作用。

程序案例

例如,下面的程序代碼,InterruptedTask類實現了Runnable接口,在run()方法中,獲取當前線程的句柄,并在while(true)循環中,通過isInterrupted()方法來檢測當前線程是否被中斷,如果當前線程被中斷就退出while(true)循環,同時,在while(true)循環中,還有一行Thread.sleep(100)代碼,并捕獲了InterruptedException異常。整個代碼如下所示。

  1. package io.binghe.concurrent.lab08; 
  2.  
  3. /** 
  4.  * @author binghe 
  5.  * @version 1.0.0 
  6.  * @description 線程測試中斷 
  7.  */ 
  8. public class InterruptedTask implements Runnable{ 
  9.  
  10.     @Override 
  11.     public void run() { 
  12.  
  13.         Thread currentThread = Thread.currentThread(); 
  14.         while (true){ 
  15.             if(currentThread.isInterrupted()){ 
  16.                 break; 
  17.             } 
  18.  
  19.             try { 
  20.                 Thread.sleep(100); 
  21.             } catch (InterruptedException e) { 
  22.                 e.printStackTrace(); 
  23.             } 
  24.         } 
  25.     } 

上述代碼的本意是通過isInterrupted()方法檢查線程是否被中斷了,如果中斷了就退出while循環。其他線程通過調用執行線程的interrupt()方法來中斷執行線程,此時會設置執行線程的中斷標志位,從而使currentThread.isInterrupted()返回true,這樣就能夠退出while循環。

這看上去沒啥問題啊!但真的是這樣嗎?我們創建一個InterruptedTest類用于測試,代碼如下所示。

  1. package io.binghe.concurrent.lab08; 
  2.  
  3. /** 
  4.  * @author binghe 
  5.  * @version 1.0.0 
  6.  * @description 測試線程中斷 
  7.  */ 
  8. public class InterruptedTest { 
  9.     public static void main(String[] args){ 
  10.         InterruptedTask interruptedTask = new InterruptedTask(); 
  11.         Thread interruptedThread = new Thread(interruptedTask); 
  12.         interruptedThread.start(); 
  13.         try { 
  14.             Thread.sleep(1000); 
  15.         } catch (InterruptedException e) { 
  16.             e.printStackTrace(); 
  17.         } 
  18.         interruptedThread.interrupt(); 
  19.     } 

我們運行main方法,如下所示。

這竟然跟我們想象的不一樣!不一樣!不一樣!這是為什么呢?

問題分析

上述代碼明明調用了線程的interrupt()方法來中斷線程,但是卻并沒有起到啥作用。原因是線程的run()方法在執行的時候,大部分時間都是阻塞在sleep(100)上,當其他線程通過調用執行線程的interrupt()方法來中斷執行線程時,大概率的會觸發InterruptedException異常,在觸發InterruptedException異常的同時,JVM會同時把線程的中斷標志位清除,所以,這個時候在run()方法中判斷的currentThread.isInterrupted()會返回false,也就不會退出當前while循環了。

既然問題分析清楚了,那如何中斷線程并退出程序呢?

問題解決

正確的處理方式應該是在InterruptedTask類中的run()方法中的while(true)循環中捕獲異常之后重新設置中斷標志位,所以,正確的InterruptedTask類的代碼如下所示。

  1. package io.binghe.concurrent.lab08; 
  2.  
  3. /** 
  4.  * @author binghe 
  5.  * @version 1.0.0 
  6.  * @description 中斷線程測試 
  7.  */ 
  8. public class InterruptedTask implements Runnable{ 
  9.  
  10.     @Override 
  11.     public void run() { 
  12.  
  13.         Thread currentThread = Thread.currentThread(); 
  14.         while (true){ 
  15.             if(currentThread.isInterrupted()){ 
  16.                 break; 
  17.             } 
  18.  
  19.             try { 
  20.                 Thread.sleep(100); 
  21.             } catch (InterruptedException e) { 
  22.                 e.printStackTrace(); 
  23.                 currentThread.interrupt(); 
  24.             } 
  25.         } 
  26.     } 

可以看到,我們在捕獲InterruptedException異常的catch代碼塊中新增了一行代碼。

  1. currentThread.interrupt(); 

這就使得我們捕獲到InterruptedException異常后,能夠重新設置線程的中斷標志位,從而中斷當前執行的線程。

我們再次運行InterruptedTest類的main方法,如下所示。

總結

處理InterruptedException異常時要小心,如果在調用執行線程的interrupt()方法中斷執行線程時,拋出了InterruptedException異常,則在觸發InterruptedException異常的同時,JVM會同時把執行線程的中斷標志位清除,此時調用執行線程的isInterrupted()方法時,會返回false。此時,正確的處理方式是在執行線程的run()方法中捕獲到InterruptedException異常,并重新設置中斷標志位(也就是在捕獲InterruptedException異常的catch代碼塊中,重新調用當前線程的interrupt()方法)。

本文轉載自微信公眾號「冰河技術」,可以通過以下二維碼關注。轉載本文請聯系冰河技術公眾號。

 

責任編輯:武曉燕 來源: 冰河技術
相關推薦

2018-06-28 08:41:37

2020-06-01 11:01:28

智慧城市物聯網技術

2014-07-02 10:03:42

App推廣渠道

2016-09-30 09:49:05

2021-11-03 12:34:41

黑客網絡釣魚攻擊

2020-06-20 14:15:53

信息安全數據技術

2024-11-21 08:31:07

耗資源神秘進程

2018-03-07 11:00:27

2025-01-26 09:35:45

2021-10-27 06:49:34

線程池Core函數

2010-09-09 21:34:06

2021-11-15 10:35:46

Python線程代碼

2022-03-09 09:43:01

工具類線程項目

2024-03-25 12:30:05

AI模型

2023-02-01 16:36:31

GNOMEChatGPTLinux

2010-04-01 09:18:38

云計算

2021-02-03 10:34:35

多云云安全CISO

2014-11-28 09:45:35

程序員

2021-04-29 15:55:51

編程IT程序員

2014-08-07 10:52:18

GitHub代碼托管
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区二区在线视频 | 久久网亚洲 | 国产成人99久久亚洲综合精品 | 色橹橹欧美在线观看视频高清 | 黑人一级片视频 | 国产一区二区在线播放视频 | 国产精品视频在线播放 | 国产精品精品久久久 | 日韩一级不卡 | 黄a免费看| 国产日韩视频 | 精品久久电影 | 久久久精品一区二区 | 久精品久久 | 国产九一精品 | 国内精品视频在线观看 | 红色av社区 | a级毛片毛片免费观看久潮喷 | 毛片99| 国产网站在线免费观看 | 亚洲一区视频 | 九九伊人sl水蜜桃色推荐 | 国产精品综合网 | 国产精品久久久久久久久久久免费看 | 中文字幕在线观看精品 | 国产在线观看一区二区三区 | 亚洲91 | 国产日韩欧美精品 | 亚洲一区二区中文字幕 | 国产黄色在线观看 | 国产在线精品一区二区 | 中文字幕欧美在线观看 | 亚洲精品一区二三区不卡 | 欧美一级二级视频 | 国产成人精品福利 | 中国美女一级黄色片 | 久久精品国产99国产精品 | 午夜精品久久久久久久久久久久久 | 午夜小影院 | 亚洲一区二区三区高清 | 伊人久久综合 |