亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2021年05月19日 16:20:49   作者:Ztrue  
Interrupt 的其作用是"中斷"線程, 但實(shí)際上線程仍會(huì)繼續(xù)運(yùn)行, 這是一個(gè)非常容易混淆的概念. Interrupt 的真正作用是給線程對(duì)象設(shè)置一個(gè)中斷標(biāo)記, 并不會(huì)影響線程的正常運(yùn)行,需要的朋友可以參考下

一、測(cè)試代碼

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

二、測(cè)試

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

 /**
 * 調(diào)用 interrupt 并不會(huì)影響線程正常運(yùn)行
 */
@Test
public 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 - 2561
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2562
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2563
20:29:57.486 [main] INFO cn.diswares.blog.interrupt.InterruptTests - interrupt 前 t1 interrupt 狀態(tài) = false
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2564
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2565
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2566
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2567
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2568
20:29:57.633 [main] INFO cn.diswares.blog.interrupt.InterruptTests - interrupt 后 t1 interrupt 狀態(tài) = true
20:29:57.633 [main] INFO cn.diswares.blog.interrupt.InterruptTests - t1 是否存活 = true
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2569
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2570
20:29:57.633 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - 2571
ignore 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
為了方便理解. 寫(xiě)一個(gè) DEMO

七、DEMO

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

/**
 * 二次調(diào)用 t1.interrupted()
 */
@Test
public 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 = true
21: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()
 */
@Test
public 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 live
21:11:20.504 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - t1 is live
21:11:20.490 [main] INFO cn.diswares.blog.interrupt.InterruptTests - false
21:11:20.504 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - t1 is live
21:11:20.504 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - t1 is live
21:11:20.504 [Thread-1] INFO cn.diswares.blog.interrupt.InterruptTests - t1 is live
ignore 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)行
 */
@Test
public 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)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 自定義類加載器的父類為何是AppClassLoader說(shuō)明

    自定義類加載器的父類為何是AppClassLoader說(shuō)明

    這篇文章主要介紹了自定義類加載器的父類為何是AppClassLoader說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 詳解Spring Cache使用Redisson分布式鎖解決緩存擊穿問(wèn)題

    詳解Spring Cache使用Redisson分布式鎖解決緩存擊穿問(wèn)題

    本文主要介紹了詳解Spring Cache使用Redisson分布式鎖解決緩存擊穿問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Java中的Lambda表達(dá)式詳解

    Java中的Lambda表達(dá)式詳解

    這篇文章主要介紹了Java中的Lambda表達(dá)式詳解,Lambda 表達(dá)式是 JDK8 的一個(gè)新特性,可以取代大部分的匿名內(nèi)部類,寫(xiě)出更優(yōu)雅的 Java 代碼,尤其在集合的遍歷和其他集合操作中,可以極大地優(yōu)化代碼結(jié)構(gòu),需要的朋友可以參考下
    2024-01-01
  • IntelliJ IDEA(2017)安裝和破解的方法

    IntelliJ IDEA(2017)安裝和破解的方法

    這篇文章主要介紹了IntelliJ IDEA(2017)安裝和破解的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • Java如何使用interrupt()終止線程

    Java如何使用interrupt()終止線程

    這篇文章主要介紹了Java如何使用interrupt()終止線程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java中Spring使用Quartz任務(wù)調(diào)度定時(shí)器

    Java中Spring使用Quartz任務(wù)調(diào)度定時(shí)器

    本篇文章主要介紹了Java中Spring使用Quartz任務(wù)調(diào)度定時(shí)器,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2017-02-02
  • Springboot集成百度地圖實(shí)現(xiàn)定位打卡的示例代碼

    Springboot集成百度地圖實(shí)現(xiàn)定位打卡的示例代碼

    本文主要介紹了Springboot集成百度地圖實(shí)現(xiàn)定位打卡的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • SpringCloud?Gateway實(shí)現(xiàn)API接口加解密

    SpringCloud?Gateway實(shí)現(xiàn)API接口加解密

    這篇文章主要為大家介紹了SpringCloud?Gateway如何實(shí)現(xiàn)API接口加解密的,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定的幫助,需要的可以參考一下
    2022-06-06
  • 使用maven工具解決jar包沖突或重復(fù)加載的問(wèn)題

    使用maven工具解決jar包沖突或重復(fù)加載的問(wèn)題

    這篇文章主要介紹了使用maven工具解決jar包沖突或重復(fù)加載的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Java 如何優(yōu)雅的拷貝對(duì)象屬性

    Java 如何優(yōu)雅的拷貝對(duì)象屬性

    這篇文章主要介紹了Java 如何優(yōu)雅的拷貝對(duì)象屬性,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-11-11

最新評(píng)論