欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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時,如果調(diào)用了interrupt()方法,將會拋出InterruptedException異常。捕獲異常之后,會重置interrupt標志位。

wait、sleep、join與interrupt

當一個線程在wait、sleep或join時,如果調(diào)用了其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內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MyBatis-Plus實現(xiàn)2種分頁方法(QueryWrapper查詢分頁和SQL查詢分頁)

    MyBatis-Plus實現(xiàn)2種分頁方法(QueryWrapper查詢分頁和SQL查詢分頁)

    本文主要介紹了MyBatis-Plus實現(xiàn)2種分頁方法,主要包括QueryWrapper查詢分頁和SQL查詢分頁,具有一定的參考價值,感興趣的可以了解一下
    2021-08-08
  • java GUI編程之paint繪制操作示例

    java GUI編程之paint繪制操作示例

    這篇文章主要介紹了java GUI編程之paint繪制操作,結合實例形式詳細分析了java GUI編程paint繪制相關操作技巧與使用注意事項,需要的朋友可以參考下
    2020-01-01
  • Java調(diào)用elasticsearch本地代碼的操作方法

    Java調(diào)用elasticsearch本地代碼的操作方法

    這篇文章主要介紹了Java調(diào)用elasticsearch本地代碼的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-04-04
  • 時間中間鍵的整理

    時間中間鍵的整理

    這篇文章主要介紹了時間中間鍵的整理的相關資料,如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • Java中toString函數(shù)的使用示例代碼

    Java中toString函數(shù)的使用示例代碼

    toString()函數(shù)用于將當前對象以字符串的形式返回,比如我定義了一個User類,創(chuàng)建了一個user對象,然后使用相應命令去打印user對象,本文結合示例代碼介紹了toString函數(shù)的使用,需要的朋友可以參考下
    2024-02-02
  • springboot2.x解決運行順序及Bean對象注入順序的問題

    springboot2.x解決運行順序及Bean對象注入順序的問題

    這篇文章主要介紹了springboot2.x解決運行順序及Bean對象注入順序的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • 2020最新IDEA SpringBoot整合Dubbo的實現(xiàn)(zookeeper版)

    2020最新IDEA SpringBoot整合Dubbo的實現(xiàn)(zookeeper版)

    這篇文章主要介紹了2020最新IDEA SpringBoot整合Dubbo(zookeeper版),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • 基于常用json框架介紹和Jackson返回結果處理方式

    基于常用json框架介紹和Jackson返回結果處理方式

    這篇文章主要介紹了基于常用json框架介紹和Jackson返回結果處理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 深入java事件注冊的應用分析

    深入java事件注冊的應用分析

    本篇文章是對java事件注冊進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • 關于MyBatis結果映射的實例總結

    關于MyBatis結果映射的實例總結

    結果集映射主要是為了解決屬性名和類型名不一致的問題,下面這篇文章主要給大家介紹了關于MyBatis結果映射的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-05-05

最新評論