日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java多線程之Interrupt中斷線程詳解

瀏覽:175日期:2022-08-12 13:33:27
目錄一、測試代碼二、測試三、執行過程描述四、輸出日志五、結論六、主要方法釋義七、DEMO八、拓展程序九、實戰一、測試代碼

https://gitee.com/zture/spring-test/blob/master/multithreading/src/test/java/cn/diswares/blog/InterruptTests.java

二、測試

為了方便理解簡介中 interrupt 的概念, 寫個 DEMO 測試一下

/** * 調用 interrupt 并不會影響線程正常運行 */@Testpublic void testInvokeInterrupt() throws InterruptedException { Thread t1 = new Thread(() -> { for (int i = 0; ; i++) { log.info(i + ''); } }); t1.start(); // 確保 t1.start() 成功執行 Thread.sleep(1); log.info('interrupt 前 t1 interrupt 狀態 = {}', t1.isInterrupted()); t1.interrupt(); log.info('interrupt 后 t1 interrupt 狀態 = {}', t1.isInterrupted()); log.info('t1 是否存活 = {}', t1.isAlive());}三、執行過程描述 首先 main 線程中啟動 t1線程 t1 線程死循環輸出 i++ main 線程確保 t1.start() 執行后 打印 t1 線程的線程中斷狀態 調用 t1.interrupt() 方法使線程中斷 打印 t1 線程的線程中斷狀態四、輸出日志

ignore logs ......20:29:57.632 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 256120:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 256220:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 256320:29:57.486 [main] INFO cn.diswares.blog.interrupt.InterruptTests - interrupt 前 t1 interrupt 狀態 = false20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 256420:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 256520:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 256620:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 256720:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 256820:29:57.633 [main] INFO cn.diswares.blog.interrupt.InterruptTests - interrupt 后 t1 interrupt 狀態 = true20:29:57.633 [main] INFO cn.diswares.blog.interrupt.InterruptTests - t1 是否存活 = true20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 256920:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 257020:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2571ignore logs ......

現象描述

調用 t1.interrupt() 執行前線程的 interrupt 狀態為 false 調用 t1.interrupt() 執行后線程的 interrupt 狀態為 true 線程并沒有被中斷, 可以成功死循環輸出循環次數五、結論

Interrupt 的真正作用是給線程對象設置一個中斷標記, 并不會影響線程的正常運行

六、主要方法釋義

new Thread().interrupt()

中斷此線程(此線程不一定是當前線程,而是指調用該方法的Thread實例所代表的線程),但實際上只是給線程設置一個中斷標志,線程仍會繼續運行。

Thread.interrupted()

注意: 這是個靜態方法測試當前線程是否被中斷(檢查中斷標志), 返回一個當前線程的 interrupt 狀態, 并重置.當我們第二次調用時中斷狀態已經被重置, 將返回一個false為了方便理解. 寫一個 DEMO

七、DEMO

DEMO 非常簡單, 調用兩次 Thread.interrupted() 觀察 main 線程的 interrupt 標記

/** * 二次調用 t1.interrupted() */@Testpublic void testDoubleInvokeInterrupted () throws InterruptedException { Thread.currentThread().interrupt(); log.info('interrupted1 = {}', Thread.interrupted()); log.info('interrupted2 = {}', Thread.interrupted());}

輸出日志

21:06:33.397 [main] INFO cn.diswares.blog.interrupt.InterruptTests - interrupted1 = true21:06:33.402 [main] INFO cn.diswares.blog.interrupt.InterruptTests - interrupted2 = false

八、拓展程序

由于是靜態方法. 我們來看一下另一個小程序.

跟之前一樣將 t1 程序中斷 調用 t1.interrupted() 注意這里是個靜態方法

/** * 在主線程中調用 t1.interrupted() */@Testpublic void testMainInterrupted() throws InterruptedException { Thread t1 = new Thread(() -> {for (int i = 0; ; i++) { log.info('t1 is live');} }); t1.start(); Thread.sleep(1); t1.interrupt(); Thread.sleep(1); log.info('{}', t1.interrupted());}

拓展程序日志

ignore logs ......21:11:20.504 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - t1 is live21:11:20.504 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - t1 is live21:11:20.490 [main] INFO cn.diswares.blog.interrupt.InterruptTests - false21:11:20.504 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - t1 is live21:11:20.504 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - t1 is live21:11:20.504 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - t1 is liveignore logs ......

拓展程序結論

Thread.interrupted() 方法是靜態方法 它的實現為 Thread.currentThread(), 獲取的是當前正在執行的線程, JDK 原文注釋如下

Returns a reference to the currently executing thread object.

Returns: the currently executing thread.

所以這里 t1.interrupted() 返回的其實是 main 線程的線程中斷標記

new Thread().isInterrupted()

返回線程對象的中斷標記, 不會改變中斷標記

true: 中斷標記存在 false: 未設置中斷標記狀態

優雅的結束一個線程

在 Java 中結束一個線程一般有下面三種手段:

(禁用) Thread.stop() 這個方法已經被廢棄. 因為這種結束線程的方式過于暴力. 會將當前線程暴力終結. 同時線程持有的鎖也都會釋放, 并且用戶有任何額外的處理來控制, 會導致數據不一致 volatile: 外部申明 volatile 開關變量, 當開關條件不滿足時結束 (推薦) interrupt: 最優雅的方案九、實戰

最初的 DEMO 是個死循環, 那我們對其改造一下. 讓它能夠優雅的結束

/** * 調用 interrupt 并不會影響線程正常運行 */@Testpublic void testGracefulEndThread() throws InterruptedException { Thread t1 = new Thread(() -> {for (int i = 0; ; i++) { if (Thread.currentThread().isInterrupted()) {log.info('{} = true, i = {}', Thread.currentThread().getName(), i);break; } else {log.info('{} = false, i = {}', Thread.currentThread().getName(), i); }} }); t1.start(); // 確保 t1.start() 成功執行 TimeUnit.SECONDS.sleep(1); t1.interrupt(); TimeUnit.SECONDS.sleep(1); log.info(t1.getState().toString());}

到此這篇關于Java多線程之Interrupt中斷線程詳解的文章就介紹到這了,更多相關Java Interrupt中斷線程內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产日韩综合| 日韩av一级片| 欧美影院三区| 狠狠久久伊人中文字幕| 国产伊人久久| 国产欧美一区| 日韩大片免费观看| 日韩理论片av| 高清久久精品| 久久福利一区| 国产欧美日韩精品一区二区免费| 色婷婷成人网| 欧美极品一区二区三区| 国产白浆在线免费观看| 免费国产自久久久久三四区久久| 精品1区2区3区4区| 日本国产亚洲| 亚洲黄色中文字幕| 伊人久久国产| 国产精品av一区二区| 国产午夜精品一区二区三区欧美| 免费观看在线综合色| 麻豆成人在线观看| 久久精品资源| 欧美日韩在线观看首页| 欧美日韩中文字幕一区二区三区| 一区在线观看| 日本精品国产| 欧美成人一二区| 91精品韩国| 中文字幕一区二区三区日韩精品| 国产精品mm| 日韩欧美2区| 国产欧美88| 激情综合五月| 免费观看不卡av| 日韩av网站在线免费观看| 美女一区网站| 亚洲中午字幕| 国产精品久久久久久模特| 日韩在线二区| 亚洲欧美日韩国产一区二区| 欧美三级第一页| 国产色综合网| 日韩国产欧美三级| 精品视频免费| 亚洲深夜福利在线观看| 日韩av一级片| 精精国产xxxx视频在线播放| 亚洲免费中文| 久久一区精品| 欧美日韩国产探花| 国产伦理一区| 蜜桃成人av| 欧美一区精品| 欧美一区二区性| 国产精品一级| 黄色在线一区| 老鸭窝一区二区久久精品| 欧美午夜不卡| 国产毛片一区二区三区| 欧美日韩中文字幕一区二区三区| 日韩三区四区| 成人黄色av| 国产日韩一区| 久久人人精品| 国产中文在线播放| 欧美日韩1区| 亚洲精品极品| 午夜日韩av| 中文欧美日韩| 日韩av资源网| 正在播放日韩精品| 黄色成人在线网址| 国产精品tv| 国产精品久久久久久久久久白浆 | 黑丝一区二区三区| 国产乱论精品| 在线观看免费一区二区| 精品视频在线一区二区在线| 蜜桃视频在线观看一区二区| 夜鲁夜鲁夜鲁视频在线播放| 久久精品99国产精品| 免费在线看一区| 99久久久久国产精品| 精品一区二区三区中文字幕在线| 亚洲三级av| 丝袜av一区| 国产福利资源一区| 精品一区在线| 国产一区调教| 国产亚洲高清在线观看| 视频一区二区不卡| 久久国产主播| 国产aⅴ精品一区二区四区| 91亚洲无吗| 在线国产精品一区| 九色精品91| 999国产精品永久免费视频app| 久久久久97| 国产欧美自拍一区| 日韩精品一区二区三区av| 国产高清久久| 亚洲不卡av不卡一区二区| 久久狠狠久久| 97久久精品| 亚洲制服欧美另类| 99国产一区| 合欧美一区二区三区| 国产精品88久久久久久| 久久久精品久久久久久96| 成人三级高清视频在线看| 久久中文字幕导航| 国产一区一一区高清不卡| 国产精品xxx在线观看| 91精品日本| 国产日产精品_国产精品毛片| 欧美精品中文| 国产亚洲高清一区| 亚洲三级国产| 亚洲精品影院在线观看| 欧美综合国产| 一区二区不卡| 亚洲精品影院在线观看| 婷婷精品在线观看| 日韩高清三区| 国产精品一区二区三区av| 国产精品2区| 麻豆91在线播放| 国产91在线播放精品| 美女av在线免费看| 色婷婷久久久| 亚洲激情二区| 中文字幕一区二区三区四区久久| 亚洲少妇自拍| 亚洲人成在线影院| 日韩av一级片| 精品国产鲁一鲁****| 超碰超碰人人人人精品| 久久久久亚洲| 久久国产精品99国产| 亚洲专区视频| 国产欧美日本| 日本黄色精品| 亚洲黑丝一区二区| 水野朝阳av一区二区三区| 亚洲精品国产精品粉嫩| 欧美另类中文字幕| 97国产成人高清在线观看| 国产夫妻在线| 午夜久久久久| 日韩视频1区| 91中文字幕精品永久在线| 欧美日韩在线播放视频| 亚洲一区av| 久久99性xxx老妇胖精品| 免费看av不卡| 亚洲欧美日韩在线观看a三区| 欧美一区在线观看视频| 美女精品一区二区| 欧美不卡在线| 久久亚洲电影| 国产精品扒开腿做爽爽爽软件| 欧洲av不卡| 亚洲一区欧美| 精品国产美女a久久9999| 日韩精品免费一区二区在线观看| 久久国产精品久久w女人spa| 国产剧情一区| 久久久久久免费视频| 日韩毛片网站| 中文另类视频| 日韩三级久久| 中文在线а√天堂| 日韩中文字幕一区二区三区| 国产精品巨作av| 国产韩日影视精品| 国产精品久久久久久久久久妞妞| 日韩精品首页| 日韩福利视频一区| 天堂日韩电影| 欧美视频精品全部免费观看| 久久久久久久久丰满| 日韩av在线免费观看不卡| 日韩精品一区二区三区免费观看| 色综合视频一区二区三区日韩 | 免费精品视频最新在线| 麻豆传媒一区二区三区| 国产精品婷婷| 精品国产鲁一鲁****| 美女日韩在线中文字幕| 国产中文字幕一区二区三区| 免费观看在线综合| 久久久久久久久久久妇女| 日韩高清一区二区| 欧美亚洲激情| 久久一区精品| 亚洲乱码久久| 不卡中文字幕| 日韩免费av|