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

Java線程中的interrupt詳解

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

interrupt概念

interrupt翻譯成中文為“打斷”的意思,但實際上,interrupt()方法并非將一個線程打中斷的意思。查看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()方法只是設置了Thread對象中的一個標志位而已(Just to set the interrupt flag)。它的意義在于,線程可以通過這個標志位來決定需要做什么操作。

interrupt相關方法

  • interrupt()
    打斷某個線程(設置標志位)
  • isInterrupted()
    查詢某個線程是否被打斷過(查詢標志位)
  • interrupted()
    查詢當前線程是否被打斷過,并重置標志位
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

可知當線程sleep時,如果調用了interrupt()方法,將會拋出InterruptedException異常。捕獲異常之后,會重置interrupt標志位。

wait、sleep、join與interrupt

當一個線程在wait、sleep或join時,如果調用了其interrupt()方法,則會拋出InterruptedException異常。

synchronized與interrupt

當一個線程在等待鎖的時候,其能否被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 獲得鎖

可知當線程等待鎖時,并不會被打斷。

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 獲得鎖

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

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

相關文章

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

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

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

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

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

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

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

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

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

    jvm雙親委派 vs 破壞雙親委派理解加載器的權責分配

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

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

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

    關于spring.factories失效原因分析及解決

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

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

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

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

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

    Java BufferedOutputStream類的常用方法講解

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

最新評論

亚东县| 麻城市| 神农架林区| 得荣县| 横峰县| 大邑县| 扬中市| 大同市| 乐业县| 蒙阴县| 汕头市| 遂溪县| 菏泽市| 阳高县| 惠州市| 内黄县| 湟中县| 新龙县| 遵义市| 沂源县| 荔浦县| 繁峙县| 通化县| 新建县| 保定市| 泽库县| 娄烦县| 收藏| 景宁| 格尔木市| 德保县| 阿瓦提县| 双鸭山市| 司法| 沂源县| 昭觉县| 正定县| 平乡县| 金湖县| 青川县| 古田县|