国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

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

瀏覽:95日期: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
相關文章:
主站蜘蛛池模板: a黄视频 | 亚洲精品tv久久久久 | 在线视频三区 | 美国一级视频 | 精品国产三级a∨在线观看 精品国产三级a在线观看 | 亚洲综合国产 | 亚洲美女高清aⅴ视频免费 亚洲美女黄色片 | 国产小毛片 | 国产一级特黄一级毛片 | 国产亚洲精品精品国产亚洲综合 | 国产日韩在线播放 | 欧美一级毛片欧美一级 | 亚洲综合中文 | 韩国欧洲一级毛片免费 | 黄色wwwwww| 男人的天堂中文字幕 | 国产99视频精品免费观看7 | 未成人做爰视频www 窝窝午夜精品一区二区 | 久久91在线| 欧美日韩亚洲视频 | 国产精品色综合久久 | 国产在线观看91精品一区 | 久久福利资源站免费观看i 久久高清精品 | 久久这里只有精品免费视频 | 久久免费视频1 | 18视频网站在线观看 | 蕾丝视频永久在线入口香蕉 | 亚洲综合成人在线 | 久久黄色免费网站 | 久久国产成人亚洲精品影院老金 | 精品国产97在线观看 | 国产精品亚洲二区 | 亚洲国产精品一区二区不卡 | 久久91亚洲精品中文字幕奶水 | 久久久久国产午夜 | 欧美日韩一区二区视频免费看 | 色黄网站aaaaaa级毛片 | 成人夜色香网站在线观看 | 色一级片 | 亚洲影院在线 | 免费看欧美一级特黄a毛片 免费看片aⅴ免费大片 |