最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java線程中的interrupt詳解

 更新時(shí)間:2023年09月26日 08:31:26   作者:EileenChang  
這篇文章主要介紹了Java線程中的interrupt詳解,interrupt翻譯成中文為“打斷”的意思,但實(shí)際上,interrupt()方法并非將一個(gè)線程打中斷的意思,本文提供了部分實(shí)現(xiàn)代碼,需要的朋友可以參考下

interrupt概念

interrupt翻譯成中文為“打斷”的意思,但實(shí)際上,interrupt()方法并非將一個(gè)線程打中斷的意思。查看Thread.interrupt()方法的源碼:

public void interrupt() {
        if (this != Thread.currentThread())
            checkAccess();
        synchronized (blockerLock) {
            Interruptible b = blocker;
            if (b != null) {
                interrupt0();           // Just to set the interrupt flag
                b.interrupt(this);
                return;
            }
        }
        interrupt0();
    }

從以上源碼可以知道,interrupt()方法只是設(shè)置了Thread對(duì)象中的一個(gè)標(biāo)志位而已(Just to set the interrupt flag)。它的意義在于,線程可以通過這個(gè)標(biāo)志位來決定需要做什么操作。

interrupt相關(guān)方法

  • interrupt()
    打斷某個(gè)線程(設(shè)置標(biāo)志位)
  • isInterrupted()
    查詢某個(gè)線程是否被打斷過(查詢標(biāo)志位)
  • interrupted()
    查詢當(dāng)前線程是否被打斷過,并重置標(biāo)志位
public class TestThread {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                System.out.println("Thread is interrupted");
                System.out.println(Thread.currentThread().isInterrupted());
            }
        });
        thread.start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread.interrupt();
    }
}

輸出如下:

Thread is interrupted
false

可知當(dāng)線程sleep時(shí),如果調(diào)用了interrupt()方法,將會(huì)拋出InterruptedException異常。捕獲異常之后,會(huì)重置interrupt標(biāo)志位。

wait、sleep、join與interrupt

當(dāng)一個(gè)線程在wait、sleep或join時(shí),如果調(diào)用了其interrupt()方法,則會(huì)拋出InterruptedException異常。

synchronized與interrupt

當(dāng)一個(gè)線程在等待鎖的時(shí)候,其能否被interrupt打斷?

public class TestThread {
    public static void main(String[] args) {
        final Object o = new Object();
        new Thread(() -> {
            synchronized (o) {
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        Thread thread = new Thread(() -> {
            System.out.println("thread 獲得鎖");
        });
        thread.start();
        thread.interrupt();
    }
}

輸出:

thread 獲得鎖

可知當(dāng)線程等待鎖時(shí),并不會(huì)被打斷。

ReentrantLock與interrupt

public class TestThread {
    public static void main(String[] args) {
        Lock lock = new ReentrantLock();
        Thread t1 = new Thread(() -> {
            lock.lock();
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            lock.unlock();
        });
        Thread t2 = new Thread(() -> {
            lock.lock();
            System.out.println("t2 獲得鎖");
            lock.unlock();
        });
        t1.start();
        t2.start();
        t2.interrupt();
    }
}

輸出:

t2 獲得鎖

此時(shí),線程在lock等待時(shí)依然不會(huì)被打斷。如果希望線程在lock等待時(shí)可以被打斷,可使用lockInterruptibly方法。

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

相關(guān)文章

  • Java編譯錯(cuò)誤java.lang.NoSuchFieldError的解決方案詳析

    Java編譯錯(cuò)誤java.lang.NoSuchFieldError的解決方案詳析

    java.lang.NoSuchFieldError是 Java 中的一種運(yùn)行時(shí)錯(cuò)誤,這篇文章主要介紹了Java編譯錯(cuò)誤java.lang.NoSuchFieldError的解決方案,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-11-11
  • Java異常處理之try...catch...finally詳解

    Java異常處理之try...catch...finally詳解

    今天小編就為大家分享一篇關(guān)于Java異常處理之try...catch...finally詳解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 在Spring Boot中集成RabbitMQ詳細(xì)步驟(最新推薦)

    在Spring Boot中集成RabbitMQ詳細(xì)步驟(最新推薦)

    本文將介紹如何在Spring Boot項(xiàng)目中集成RabbitMQ,實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者的基本配置,本文分步驟給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-12-12
  • mybatis mapper.xml 區(qū)間查詢條件詳解

    mybatis mapper.xml 區(qū)間查詢條件詳解

    這篇文章主要介紹了mybatis mapper.xml 區(qū)間查詢條件詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • jvm雙親委派 vs 破壞雙親委派理解加載器的權(quán)責(zé)分配

    jvm雙親委派 vs 破壞雙親委派理解加載器的權(quán)責(zé)分配

    這篇文章主要為大家介紹了jvm雙親委派 vs 破壞雙親委派對(duì)比來理解加載器的權(quán)責(zé)分配,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 基于java實(shí)現(xiàn)一個(gè)脫敏組件

    基于java實(shí)現(xiàn)一個(gè)脫敏組件

    這篇文章主要為大家詳細(xì)介紹了如何基于java實(shí)現(xiàn)一個(gè)脫敏組件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • 關(guān)于spring.factories失效原因分析及解決

    關(guān)于spring.factories失效原因分析及解決

    這篇文章主要介紹了關(guān)于spring.factories失效原因分析及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java后端對(duì)接微信支付(小程序、APP、PC端掃碼)包含查單退款

    Java后端對(duì)接微信支付(小程序、APP、PC端掃碼)包含查單退款

    微信支付我們主要聚焦于這三種支付方式,其中JSPAI與APP主要與uniapp開發(fā)微信小程序與APP對(duì)接,本文主要介紹了Java后端對(duì)接微信支付(小程序、APP、PC端掃碼)包含查單退款,具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-12-12
  • Maven中怎么手動(dòng)添加jar包到本地倉庫詳解(repository)

    Maven中怎么手動(dòng)添加jar包到本地倉庫詳解(repository)

    這篇文章主要給大家介紹了關(guān)于Maven中怎么手動(dòng)添加jar包到本地倉庫的相關(guān)資料,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Java BufferedOutputStream類的常用方法講解

    Java BufferedOutputStream類的常用方法講解

    這篇文章主要介紹了Java BufferedOutputStream類的常用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論

民勤县| 灌南县| 屏边| 晴隆县| 岳西县| 甘孜| 吉林省| 新昌县| 广汉市| 新密市| 安溪县| 繁峙县| 商都县| 曲周县| 精河县| 新竹市| 娱乐| 慈溪市| 明光市| 河东区| 新竹市| 达孜县| 越西县| 江山市| 梁河县| 万盛区| 三明市| 石家庄市| 普洱| 连江县| 横山县| 抚州市| 通榆县| 贵南县| 潜山县| 普宁市| 那曲县| 陇西县| 贵港市| 南雄市| 靖西县|