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

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

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

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

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

二、測試

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

/** * 調(diào)用 interrupt 并不會影響線程正常運行 */@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í)行過程描述 首先 main 線程中啟動 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 線程并沒有被中斷, 可以成功死循環(huán)輸出循環(huán)次數(shù)五、結論

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

六、主要方法釋義

new Thread().interrupt()

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

Thread.interrupted()

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

七、DEMO

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

/** * 二次調(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)方法. 我們來看一下另一個小程序.

跟之前一樣將 t1 程序中斷 調(diào)用 t1.interrupted() 注意這里是個靜態(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 ......

拓展程序結論

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

Returns a reference to the currently executing thread object.

Returns: the currently executing thread.

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

new Thread().isInterrupted()

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

true: 中斷標記存在 false: 未設置中斷標記狀態(tài)

優(yōu)雅的結束一個線程

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

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

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

/** * 調(diào)用 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() 成功執(zhí)行 TimeUnit.SECONDS.sleep(1); t1.interrupt(); TimeUnit.SECONDS.sleep(1); log.info(t1.getState().toString());}

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

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
成人在线丰满少妇av| 国产精品一区二区三区四区在线观看 | 国产亚洲精aa在线看| 亚洲欧美网站在线观看| 蜜桃视频在线观看一区二区| 蜜桃视频免费观看一区| 自拍日韩欧美| 国产一级久久| 蜜桃视频第一区免费观看| 综合激情五月婷婷| 欧美日韩精品一区二区三区视频 | 99精品电影| 午夜日本精品| 国产麻豆综合| 一区二区三区四区日韩| 日韩成人午夜精品| 欧美激情网址| 日韩精品午夜| 欧美日韩国产免费观看| 在线亚洲一区| 婷婷综合国产| 国产九九精品| 麻豆网站免费在线观看| 久久国产主播| 视频精品一区二区| 日韩av二区在线播放| 麻豆精品少妇| 欧美日韩在线播放视频| 日韩中文字幕av电影| 青草综合视频| 高清av不卡| 首页国产欧美日韩丝袜| 欧美一级全黄| av资源亚洲| 国产偷自视频区视频一区二区| 日本综合精品一区| 电影91久久久| 视频一区二区三区入口| 国产精品天天看天天狠| 亚洲免费福利| 蜜臀av在线播放一区二区三区| 国产另类在线| 欧美+日本+国产+在线a∨观看| 日韩欧美三区| 日韩视频网站在线观看| 男人的天堂久久精品| 久久av超碰| 欧美特黄a级高清免费大片a级| 亚洲精品美女91| 97精品视频在线看| 日韩在线一区二区| 高清日韩欧美| 中文一区一区三区免费在线观 | 在线日韩成人| 精品一区二区三区免费看| 激情婷婷亚洲| 国产极品模特精品一二| 午夜欧美精品| 精品国产中文字幕第一页| 亚洲欧美日本日韩| 中文字幕高清在线播放| 一区二区三区四区在线观看国产日韩 | 久久的色偷偷| 99日韩精品| 日韩av有码| 日韩欧美激情电影| 999国产精品999久久久久久| 日韩av影院| 欧美天堂亚洲电影院在线观看| 久久香蕉精品香蕉| 久久亚洲风情| 久久久久99| 国产精品videossex久久发布| 香蕉国产精品| 免费一级欧美片在线观看网站| 亚洲一区二区网站| 亚洲国产福利| 国产亚洲人成a在线v网站| 久久久9色精品国产一区二区三区| 国产精品一国产精品| 夜夜嗨一区二区| 日韩成人亚洲| 久久伊人国产| 日本国产亚洲| 久久xxxx| 在线日韩中文| 色综合五月天| 国产精品扒开腿做爽爽爽软件| 免费人成网站在线观看欧美高清| jizzjizz中国精品麻豆| 国产亚洲精品美女久久久久久久久久| 99成人在线| 久久麻豆精品| 欧美片第1页| 粉嫩av一区二区三区四区五区| 日韩激情视频网站| 美国三级日本三级久久99| 午夜久久黄色| 国产一区二区中文| 国产乱码午夜在线视频| 精品一区二区三区的国产在线观看 | 91久久久久| 欧美羞羞视频| 粉嫩av一区二区三区四区五区| 国产精品任我爽爆在线播放 | 欧美另类中文字幕 | 欧美亚洲人成在线| 日韩精品久久理论片| 西西人体一区二区| 99在线观看免费视频精品观看| 久久精品国产www456c0m| 成人国产精品久久| 精品三级在线观看视频| 国产高清视频一区二区| 国产另类在线| 国产精成人品2018| 国产精品免费不| 国产高清视频一区二区| 国产精品一区二区三区美女 | 亚洲福利久久| 亚洲天堂久久| 激情综合网站| 国产在线不卡| 午夜久久tv| 亚洲一区成人| 免费久久99精品国产| 9色精品在线| 美国三级日本三级久久99| 蜜臀91精品一区二区三区| 亚洲精品一级二级三级| 日韩高清不卡一区二区| 日韩av二区在线播放| 欧美天堂一区二区| 国产午夜久久av| 精品视频网站| 欧美三级精品| 亚洲性视频h| 夜夜嗨一区二区三区| 久久国产福利| 日韩国产一二三区| 麻豆成人综合网| 国产一区二区亚洲| 日韩精品水蜜桃| 中文一区在线| 日韩av影院| 精品国产网站| 成人精品亚洲| 亚洲欧美激情诱惑| 日本成人中文字幕| 久久亚洲道色| 国产精品99一区二区| 视频一区视频二区在线观看| 日本91福利区| 国产一区二区三区久久久久久久久| 美女一区网站| 香蕉成人久久| 91福利精品在线观看| 精品欠久久久中文字幕加勒比| 亚洲爱爱视频| 亚洲视频二区| 国产精品v一区二区三区| 亚洲三级欧美| 中文无码久久精品| 老司机免费视频一区二区三区| 一本大道色婷婷在线| 99亚洲视频| 国产精品激情| 久久中文视频| 亚洲精品一区二区在线播放∴| 国产精品午夜一区二区三区| 亚洲天堂1区| 偷拍亚洲精品| 黄色aa久久| 亚洲一二av| 欧美国产小视频| 亚洲视频二区| 国产在线观看91一区二区三区| 午夜国产精品视频免费体验区| 91精品国产自产观看在线| 欧洲一区二区三区精品| 亚洲ww精品| 成人日韩在线| 欧美久久精品| av亚洲一区二区三区| 综合色一区二区| 黑森林国产精品av| 中文字幕成人| 蜜桃精品在线| 国产探花在线精品| 欧美理论视频| 精品欠久久久中文字幕加勒比| 亚洲综合精品四区| 日韩综合在线| 青青草91久久久久久久久| 久久久久久久久久久9不雅视频| 日韩福利视频导航| 在线日韩电影| 国语精品一区| 综合亚洲色图| 亚洲一级高清|