av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:101日期:2022-08-12 13:33:27
目錄一、測(cè)試代碼二、測(cè)試三、執(zhí)行過(guò)程描述四、輸出日志五、結(jié)論六、主要方法釋義七、DEMO八、拓展程序九、實(shí)戰(zhàn)一、測(cè)試代碼

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

二、測(cè)試

為了方便理解簡(jiǎn)介中 interrupt 的概念, 寫個(gè) DEMO 測(cè)試一下

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

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 狀態(tài) = 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 狀態(tài) = 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 ......

現(xiàn)象描述

調(diào)用 t1.interrupt() 執(zhí)行前線程的 interrupt 狀態(tài)為 false 調(diào)用 t1.interrupt() 執(zhí)行后線程的 interrupt 狀態(tài)為 true 線程并沒(méi)有被中斷, 可以成功死循環(huán)輸出循環(huán)次數(shù)五、結(jié)論

Interrupt 的真正作用是給線程對(duì)象設(shè)置一個(gè)中斷標(biāo)記, 并不會(huì)影響線程的正常運(yùn)行

六、主要方法釋義

new Thread().interrupt()

中斷此線程(此線程不一定是當(dāng)前線程,而是指調(diào)用該方法的Thread實(shí)例所代表的線程),但實(shí)際上只是給線程設(shè)置一個(gè)中斷標(biāo)志,線程仍會(huì)繼續(xù)運(yùn)行。

Thread.interrupted()

注意: 這是個(gè)靜態(tài)方法測(cè)試當(dāng)前線程是否被中斷(檢查中斷標(biāo)志), 返回一個(gè)當(dāng)前線程的 interrupt 狀態(tài), 并重置.當(dāng)我們第二次調(diào)用時(shí)中斷狀態(tài)已經(jīng)被重置, 將返回一個(gè)false為了方便理解. 寫一個(gè) DEMO

七、DEMO

DEMO 非常簡(jiǎn)單, 調(diào)用兩次 Thread.interrupted() 觀察 main 線程的 interrupt 標(biāo)記

/** * 二次調(diào)用 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

八、拓展程序

由于是靜態(tài)方法. 我們來(lái)看一下另一個(gè)小程序.

跟之前一樣將 t1 程序中斷 調(diào)用 t1.interrupted() 注意這里是個(gè)靜態(tài)方法

/** * 在主線程中調(diào)用 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 ......

拓展程序結(jié)論

Thread.interrupted() 方法是靜態(tài)方法 它的實(shí)現(xiàn)為 Thread.currentThread(), 獲取的是當(dāng)前正在執(zhí)行的線程, JDK 原文注釋如下

Returns a reference to the currently executing thread object.

Returns: the currently executing thread.

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

new Thread().isInterrupted()

返回線程對(duì)象的中斷標(biāo)記, 不會(huì)改變中斷標(biāo)記

true: 中斷標(biāo)記存在 false: 未設(shè)置中斷標(biāo)記狀態(tài)

優(yōu)雅的結(jié)束一個(gè)線程

在 Java 中結(jié)束一個(gè)線程一般有下面三種手段:

(禁用) Thread.stop() 這個(gè)方法已經(jīng)被廢棄. 因?yàn)檫@種結(jié)束線程的方式過(guò)于暴力. 會(huì)將當(dāng)前線程暴力終結(jié). 同時(shí)線程持有的鎖也都會(huì)釋放, 并且用戶有任何額外的處理來(lái)控制, 會(huì)導(dǎo)致數(shù)據(jù)不一致 volatile: 外部申明 volatile 開(kāi)關(guān)變量, 當(dāng)開(kāi)關(guān)條件不滿足時(shí)結(jié)束 (推薦) interrupt: 最優(yōu)雅的方案九、實(shí)戰(zhàn)

最初的 DEMO 是個(gè)死循環(huán), 那我們對(duì)其改造一下. 讓它能夠優(yōu)雅的結(jié)束

/** * 調(diào)用 interrupt 并不會(huì)影響線程正常運(yùn)行 */@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() 成功執(zhí)行 TimeUnit.SECONDS.sleep(1); t1.interrupt(); TimeUnit.SECONDS.sleep(1); log.info(t1.getState().toString());}

到此這篇關(guān)于Java多線程之Interrupt中斷線程詳解的文章就介紹到這了,更多相關(guān)Java Interrupt中斷線程內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 中文字幕一页二页 | 天天综合永久入口 | 美女在线视频一区二区三区 | 91偷拍精品一区二区三区 | 天堂一区二区三区 | 麻豆av一区二区三区久久 | 99精品国自产在线观看 | caoporn国产精品免费公开 | 亚洲欧美日韩精品久久亚洲区 | 日韩在线视频一区二区三区 | 国产视频2021 | 99久久国产免费 | 91精品久久 | 亚州av | 中文字幕一区二区三区精彩视频 | 国产精品久久久久久一区二区三区 | 久久久久久久一区二区三区 | 国产激情在线播放 | 激情免费视频 | 97色在线视频 | 夜夜夜夜夜夜曰天天天 | 欧美精品91 | 日韩电影免费观看中文字幕 | 精品国产一区二区三区久久狼黑人 | 日本a∨视频 | 日韩免费av | 99国内精品久久久久久久 | 亚洲精品国产电影 | 2019天天干夜夜操 | 成人免费看片网 | 欧美激情在线一区二区三区 | 老妇激情毛片免费 | 精品一区二区久久久久久久网站 | 欧美成人激情视频 | 日韩成人精品一区二区三区 | 成人网av| 四虎永久| 国产电影一区二区 | 国产精品久久久久久久久久免费 | 玖玖在线精品 | 欧美在线一区视频 |