多線程JUC 第2季 中斷線程

一 中斷線程

1.1 中斷概念

1.在java中,沒有提供一種立即停止一條線程。但卻給了停止線程的協商機制-中斷。

中斷是一種協商機制。中斷的過程完全需要程序員自己實現。也即,如果要中斷一個線程,你需要手動調用該線程的interrupt()方法,該方法也僅僅是將線程對象中的中斷標識設置成true;接著需要自己在方法中手動判斷當前線程的標識位,如果為true,則中斷線程。false標識未中斷。

2.一個線程不應該由其他線程中斷或者停止,而是有該線程自己自行停止,自己決定命運。

stop(),suspend,resume方法都已經廢棄。

1.2?interrupt和isinterrupted和interrupted的作用

1.public void interrupt(): 實例方法,僅僅是設置線程中斷狀態為true,發起一個協商而不會立刻停止線程。

2.public static boolean interrupted;靜態方法,判斷當前線程是否中斷并清除當前線程的中斷狀態。做兩件事:

a)返回當前線程的中斷狀態,測試當前線程是否已經中斷。

b)將當前線程的中斷狀態清零并重新設置為true,清除線程的中斷狀態。

3.public boolean isinterrupted():實例方法判斷當前線程是不是中斷,檢測中斷標志位。

1.3?interrupt的使用情況分析

當對一個線程,調用interrupt()時:

1.如果線程處于正常活動狀態,那么會將該線程的中斷標志設置為true,僅此而已。

被設置中斷標志的線程將繼續正常運行,不受影響。

interrupt()并不能真正中斷線程,需要被調用的線程自己進行配合才行。

2.如果線程處于被阻塞狀態(sleep,wait,join等狀態),在別的線程中調用當前線程對象的interrupt方法,那么線程將立即退出被阻塞的狀態,并拋出一個interruptedException異常。?

二 中斷線程方式

2.1 方式1 通過volatile變量

package com.ljf.thread.interrupt;import java.util.concurrent.atomic.AtomicBoolean;/*** @ClassName: Zhongduan2* @Description: TODO* @Author: admin* @Date: 2024/03/02?17:43:01?* @Version: V1.0**/
public class Zhongduan2 {public static volatile boolean flag=false;static AtomicBoolean atomicBoolean = new AtomicBoolean(false);public static void main(String[] args) throws InterruptedException {Thread t1= new Thread(new Runnable() {@Overridepublic void run() {while(true){if(flag){//     if(atomicBoolean.get()){System.out.println("===================開始中斷"+Thread.currentThread().getId());break;}else{System.out.println("循環中:"+Thread.currentThread().getId());}}}});t1.start();//主線程先休眠2秒Thread.sleep(5000);new Thread(new Runnable() {@Overridepublic void run() {flag=true;atomicBoolean.set(true);}}).start();}}

2.2? 方式2 通過atomicboolean 原子類

public static volatile boolean flag=false;static AtomicBoolean atomicBoolean = new AtomicBoolean(false);public static void main(String[] args) throws InterruptedException {Thread t1= new Thread(new Runnable() {@Overridepublic void run() {while(true){// if(flag){if(atomicBoolean.get()){System.out.println("===================開始中斷"+Thread.currentThread().getId());break;}else{System.out.println("循環中:"+Thread.currentThread().getId());}}}});t1.start();//主線程先休眠2秒Thread.sleep(5000);new Thread(new Runnable() {@Overridepublic void run() {flag=true;atomicBoolean.set(true);}}).start();}

2.3 方式3 通過interrupt+isinterrupted組合判斷

package com.ljf.thread.interrupt;/*** @ClassName: Zhongduan* @Description: TODO* @Author: admin* @Date: 2024/03/02?17:34:59?* @Version: V1.0**/
public class Zhongduan {public static volatile boolean flag=false;public static void main(String[] args) throws InterruptedException {Thread t1= new Thread(new Runnable() {@Overridepublic void run() {while(true){if(Thread.currentThread().isInterrupted()){System.out.println("===================開始中斷"+Thread.currentThread().getId());break;}else{System.out.println("循環中:"+Thread.currentThread().getId());}}}});t1.start();//主線程先休眠2秒Thread.sleep(5000);new Thread(new Runnable() {@Overridepublic void run() {t1.interrupt();}}).start();}
}

三 中斷線程方式的情況分析

3.1 情況1

如果線程處于被阻塞狀態(sleep,wait,join等狀態),在別的線程中調用當前線程對象的interrupt方法,那么線程將立即退出被阻塞的狀態,并拋出一個interruptedException異常。

    public static void main(String[] args){//實例方法interrupt()僅僅是設置線程的中斷狀態位設置為true,不會停止線程Thread t1 = new Thread(() -> {for (int i = 1; i <=300; i++){System.out.println("-----: "+i);}System.out.println("t1線程調用interrupt()后的的中斷標識02:"+Thread.currentThread().isInterrupted());}, "t1");t1.start();System.out.println("t1線程默認的中斷標識:"+t1.isInterrupted());//false//暫停毫秒try { TimeUnit.MILLISECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); }t1.interrupt();//trueSystem.out.println("t1線程調用interrupt()后的的中斷標識01:"+t1.isInterrupted());//truetry { TimeUnit.MILLISECONDS.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); }System.out.println("t1線程調用interrupt()后的的中斷標識03:"+t1.isInterrupted());//---false中斷不活動的線程不會產生任何影響。}

線程t1執行300次后,已經不存在,2秒后查看t1線程的狀態為false。

3.2 情況2

1.代碼

public class InterruptDemo3
{public static void main(String[] args){Thread t1 = new Thread(() -> {while (true){if(Thread.currentThread().isInterrupted()){System.out.println(Thread.currentThread().getName()+"\t " +"中斷標志位:"+Thread.currentThread().isInterrupted()+" 程序停止");break;}try {Thread.sleep(200);} catch (InterruptedException e) {Thread.currentThread().interrupt();//為什么要在異常處,再調用一次??e.printStackTrace();}System.out.println("-----hello InterruptDemo3");}}, "t1");t1.start();//暫停幾秒鐘線程try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }new Thread(() -> t1.interrupt(),"t2").start();}
}

問題:報異常,程序沒有停止

2.分析原因

* 1 中斷標志位,默認false
* 2 t2 ----> t1發出了中斷協商,t2調用t1.interrupt(),中斷標志位true
* 3 中斷標志位true,正常情況,程序停止,^_^
* 4 中斷標志位true,執行sleep 后發生異常情況,InterruptedException,將會把中斷狀態將被清除,并且將收到InterruptedException 。中斷標志位false
*    導致無限循環
*
* 5 在catch塊中,需要再次給中斷標志位設置為true,2次調用停止程序才OK

3.結論

3.3?情況3 關閉線程

https://blog.51cto.com/u_13316945/5832262

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);Future future = fixedThreadPool.submit(new Runnable() { @Override public void run() { 
new Runnable() {@Overridepublic void run() {/** 確保線程不斷執行不斷刷新界面*/while (true&&(!Thread.currentThread().isInterrupted())) {try {Log.i("tag","線程運行中"+Thread.currentThread().getId());// 每執行一次暫停40毫秒//當sleep方法拋出InterruptedException  中斷狀態也會被清掉Thread.sleep(40);} catch (InterruptedException e) {e.printStackTrace();//如果拋出異常則再次設置中斷請求Thread.currentThread().interrupt();}}}}
);
//觸發條件設置中斷
future.cancel(true);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716540.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716540.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716540.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

錄制用戶操作實現自動化任務

先上視頻&#xff01;&#xff01; 流程自動化工具-錄制操作繪制流程 這個想法之前就有了&#xff0c;趁著周末時間給它擼出來。 實現思路 從之前的文章自動化桌面未來展望中已經驗證了錄制繪制流程圖的可行性。基于DOM錄制頁面操作軌跡的思路監聽頁面點擊、輸入事件即可&…

無人機鏡頭穩定的原理和相關算法

無人機的鏡頭穩定主要基于兩個關鍵技術&#xff1a;鏡頭平衡技術和實時電子穩像。無人機鏡頭穩定的原理和相關算法主要是通過鏡頭平衡技術和實時電子穩像技術來保持攝像鏡頭的穩定性&#xff0c;從而拍攝出清晰、穩定的畫面。無人機鏡頭穩定的原理主要是通過傳感器和算法來實現…

Ocr之PaddleOcr模型訓練

目錄 一、系統環境 1 鏡像拉取ppocr 進行部署 2 安裝paddlepaddle 二、訓練前的準備 1 下載源碼 2 預模型下載 3 修改模型訓練文件yml 4 編排訓練集 5 執行腳本進行訓練 6 需要修改文件夾名稱 三、開始訓練 1 執行訓練命令 2 對第一次評估進行解釋 3 引言 五、總…

NestJS使用模板引擎ejs

模板引擎? 模板引擎是一種用于生成動態內容的工具&#xff0c;它通過將預定義的模板與特定數據結合&#xff0c;來生成最終的輸出。? 在NodeJS開發中&#xff0c;我們會使用模板引擎來渲染一些常用的頁面&#xff0c;比如渲染代表404的Not Found 頁面&#xff0c;502的Bad …

異常值檢測-值域法 頭歌代碼解釋

這關做得不是很明白&#xff0c;如果有清楚的同志可以在評論區里面討論 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.neighbors import LocalOutlierFactor # 導入數據 abc pd.read_csv(deaths.csv) ## 只分析其中的Population和L…

C語言對類型的轉換

C語言對類型的轉換 文章目錄 C語言對類型的轉換整形提升和截斷整形提升整形提升規則整形提升的意義 截斷截斷規則 算數轉換 我們都知道&#xff0c;C語言中內置了多種整形類型&#xff0c;占用空間從大到小&#xff0c;基本滿足各類使用場景&#xff08;比如超長數字的運算就不…

【【C語言簡單小題學習-1】】

實現九九乘法表 // 輸出乘法口訣表 int main() {int i 0;int j 0;for (i 1; i < 9; i){for (j 1; j < i;j)printf("%d*%d%d ", i , j, i*j);printf("\n"); }return 0; }猜數字的游戲設計 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdi…

源碼視角,vue3為什么推薦用ref,而不是reactive

ref 和 reactive 是 Vue3 中實現響應式數據的核心 API。ref 用于包裝基本數據類型&#xff0c;而 reactive 用于處理對象和數組。盡管 reactive 似乎更適合處理對象&#xff0c;但 Vue3 官方文檔更推薦使用 ref。 我的想法&#xff0c;ref就是比reactive好用&#xff0c;官方也…

Java 中對包含關系的判斷

本文將為您詳細講解 Java 中對包含關系的判斷&#xff0c;包括數組、字符串等&#xff0c;并提供相應的代碼例子。 1. 數組包含關系判斷 在 Java 中&#xff0c;數組包含關系判斷通常使用循環來實現。以下是幾種常見的判斷方法&#xff1a; 示例 1&#xff1a;使用 for…

Unity曲柄滑塊四桿機構運動計算

一、運動效果 二、機構的介紹 曲柄長度&#xff1a;a&#xff0c;線段AB長度 連桿長度&#xff1a;b&#xff0c;線段BC長度 偏心距離&#xff1a;e&#xff0c;滑塊軌跡與曲柄中心點A的垂直距離 三、已知點A點B和e的值&#xff0c;計算C點的位置 1、計算s的值 var h math.…

通過多進程并發方式(fork)實現服務器(注意要回收子進程)

以下內容為視頻學習記錄。 1、父進程accept后返回的文件描述符為cfd以及用于創建連接的lfd; 調用fork()創建子進程后&#xff0c;子進程繼承cfd,lfd&#xff0c;通過該cfd與連接過來的客戶端通信,lfd對子進程來說沒用&#xff0c;可以直接close(lfd); 對于父進程來說&#x…

雙非二本找實習前的準備day4

學習目標&#xff1a; 每天2-3到簡單sql&#xff08;刷完即止&#xff09;&#xff0c;每天復習代碼隨想錄上的題目3道算法&#xff08;時間充足可以繼續&#xff09;&#xff0c;背誦的八股的問題也在這里記錄了 今日碎碎念&#xff1a; 1&#xff09;偶爾還是貪玩游戲&…

Vue中的計算屬性和方法有什么區別?

Vue.js是一款流行的JavaScript前端框架&#xff0c;提供了豐富的功能和便捷的開發方式。在Vue中&#xff0c;計算屬性和方法是常用的兩種方式來處理數據和邏輯。但它們之間存在一些區別&#xff0c;本文將詳細介紹Vue中計算屬性和方法的區別&#xff0c;并通過示例代碼加深理解…

183896-00-6,Biotin-C3-PEG3-C3-NH2,可以選擇性降解靶蛋白

您好&#xff0c;歡迎來到新研之家 文章關鍵詞&#xff1a;183896-00-6&#xff0c;Biotin-C3-PEG3-C3-NH2&#xff0c;Biotin-C3-PEG3-C3-amine&#xff0c;生物素-C3-PEG3-C3-胺 一、基本信息 【產品簡介】&#xff1a;Biotin-PEG3-C3-NH2是一種PROTAC linker&#xff0c;…

381. 有線電視網絡(網絡流,最小割,《算法競賽進階指南》)

381. 有線電視網絡 - AcWing題庫 給定一張 n 個點 m 條邊的無向圖&#xff0c;求最少去掉多少個點&#xff0c;可以使圖不連通。 如果不管去掉多少個點&#xff0c;都無法使原圖不連通&#xff0c;則直接返回 n。 輸入格式 輸入包含多組測試數據。 每組數據占一行&#xf…

Python推導式大全與實戰:精通列表、字典、集合和生成器推導式【第115篇—python:推導式】

Python推導式大全與實戰&#xff1a;精通列表、字典、集合和生成器推導式 Python語言以其簡潔、優雅的語法而聞名&#xff0c;其中推導式是其獨特之處之一。推導式是一種在一行代碼中構建數據結構的強大方式&#xff0c;它涵蓋了列表、字典、集合和生成器。本篇博客將全面介紹…

YOLOv8實例分割實戰:ONNX模型轉換及TensorRT部署

課程鏈接&#xff1a;https://edu.csdn.net/course/detail/39320 PyTorch版的YOLOv8支持高性能的實時實例分割。 TensorRT是針對英偉達GPU的加速工具。 ONNX &#xff08;Open Neural Network Exchange&#xff09; 作為一個開放的網絡模型中間表示&#xff08;IR&#xff0…

Redis命令大全

通用命令 KEYS pattern&#xff1a;查找所有符合給定模式&#xff08;pattern&#xff09;的 key。EXISTS key&#xff1a;檢查指定 key 是否存在。TYPE key&#xff1a;返回指定 key 的數據類型。DEL key [key …]&#xff1a;刪除指定的 key。RENAME key newkey&#xff1a;…

spring boot 修復 Spring Framework URL解析不當漏洞(CVE-2024-22243)

漏洞描述 當應用程序使用UriComponentsBuilder來解析外部提供的URL&#xff08;如通過查詢參數&#xff09;并對解析的URL的主機執行驗證檢查時可能容易受到Open重定向攻擊和SSRF攻擊&#xff0c;導致網絡釣魚和內部網絡探測等。 受影響產品或系統 6.1.0 < Spring Framew…

Vue項目的快速搭建

Vue項目的快速搭建 一、下載并安裝node.js二、安裝Vue腳手架三、創建vue項目四、項目啟動五、VS Code下載安裝 一、下載并安裝node.js 首先確保已經安裝了Node.js。如果沒有安裝&#xff0c;可以去官網&#xff08;https://nodejs.org/&#xff09;下載并安裝最新版本的Node.j…