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

java中線程中斷的實現(xiàn)示例

 更新時間:2023年09月07日 09:03:30   作者:Michael_lcf  
中斷只是一種協(xié)作協(xié)商機制,Java沒有給中斷增加任何語法,中斷的過程完全需要程序員自己實現(xiàn),本文就來介紹一下線程中斷的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下

1、線程中斷 即 線程的取消/關(guān)閉的機制

Java中停止一個線程的主要機制是中斷,中斷并不是強迫終止一個線程,它是一種 協(xié)作機制 ,是給線程傳遞一個取消/關(guān)閉信號,由線程自身來決定如何以及何時退出。

停止線程,但這個方法被標記為了過時。
@Deprecated
public final void stop()
=========================
返回對應線程的中斷標志位是否為true。
public boolean isInterrupted()
返回當前線程的中斷標志位是否為true,并清空中斷標志位。
public static boolean interrupted()
表示中斷對應的線程。
public void interrupt()

2、線程對中斷interrupt()的反應

2.1、RUNNABLE:線程在運行或具備運行條件只是在等待操作系統(tǒng)調(diào)度

舉個栗子:

public static void main(String[] args) throws InterruptedException {
    Thread t = new Thread(() -> {
        while (!Thread.currentThread().isInterrupted()) {
            System.out.println("線程t 執(zhí)行中...");
        }
    });
    t.start();
    Thread.sleep(1);
    t.interrupt();
    System.out.println("main exit");
}

RUNNABLE狀態(tài)的線程tinterrupt()后,是否終止中斷線程由線程t自身代碼邏輯決定。

2.2、WAITING/TIMED_WAITING:線程在等待某個條件或超時

線程執(zhí)行如下方法會進入WAITING狀態(tài):
public final void join() throws InterruptedException
public final void wait() throws InterruptedException
線程執(zhí)行如下方法會進入TIMED_WAITING狀態(tài):
public final native void wait(long timeout) throws InterruptedException
public static native void sleep(long millis) throws InterruptedException
public final synchronized void join(long millis) throws InterruptedException

舉個栗子:

public class ThreadInterrupt {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            try {
                Thread.sleep(10000);
            } catch (InterruptedException e) {
                System.out.println("Thread.interrupted() = " + Thread.interrupted());
                //Thread.interrupted() = false
                System.out.println("Thread.interrupted() = " + Thread.interrupted());
                //Thread.interrupted() = false
            }
        });
        t.start();
        t.interrupt();
    }
}

捕獲到InterruptedException,通常表示希望結(jié)束該線程,線程大概有兩種處理方式:
向上傳遞該異常,這使得該方法也變成了一個可中斷的方法,需要調(diào)用者進行處理。

有些情況,不能向上傳遞異常,比如Thread的run方法,它的聲明是固定的,不能拋出任何受檢異常,這時,應該捕獲異常,進行合適的清理操作,清理后,一般應該調(diào)用Thread的interrupt方法設(shè)置中斷標志位,使得其他代碼有辦法知道它發(fā)生了中斷。

2.3、BLOCKED:線程在等待鎖,試圖進入同步塊

舉個栗子:

public class ThreadInterrupt {
    private final static Object lockObj = new Object();
    private static class MyBlockedThread extends Thread {
        @Override
        public void run() {
            System.out.println("MyBlockedThread.run = " + Thread.currentThread().isInterrupted());
            synchronized (lockObj) {
                while (!Thread.currentThread().isInterrupted()) {
                    System.out.println(Thread.currentThread().isInterrupted());
                }
            }
            System.out.println("exit");
        }
    }
    public static void main(String[] args) throws InterruptedException {
        synchronized (lockObj) {
            MyBlockedThread myBlockedThread = new MyBlockedThread();
            myBlockedThread.start();
            Thread.sleep(3000);
            myBlockedThread.interrupt();
            myBlockedThread.join(); // join方法會等待線程執(zhí)行完后返回
        }
    }
}

myBlockedThread.join();該行代碼放開注釋掉情況下:線程一直等待鎖 BLOCKED。

com.michael.ThreadInterrupt.MyBlockedThread.run = false

myBlockedThread.join();該行代碼注釋掉情況下:因為主線程不再等待線程myBlockedThread結(jié)束,釋放鎖lock后,線程myBlockedThread會獲得鎖,然后檢測到發(fā)生了中斷,然后程序退出。

com.michael.ThreadInterrupt.MyBlockedThread.run = false
exit

2.4、NEW/TERMINATED:線程還未啟動或已結(jié)束

舉個栗子:

public static void main(String[] args) throws InterruptedException {
    Thread t = new Thread(() -> {
        System.out.println("線程t 執(zhí)行...");
    });
    t.interrupt();
    System.out.println("NEW = " + t.isInterrupted());
    t.start();
    Thread.sleep(100);
    t.interrupt();
    System.out.println("TERMINATE = " + t.isInterrupted());
}
============ 執(zhí)行結(jié)果 ============
NEW = false
線程t 執(zhí)行...
TERMINATE = false

2.5、IO操作

如果線程在等待IO操作,尤其是網(wǎng)絡(luò)IO,則會有一些特殊的處理。

  • 如果IO通道是可中斷的,即實現(xiàn)了InterruptibleChannel接口,則線程的中斷標志位會被設(shè)置,同時線程會收到異常ClosedByInterruptException
  • 如果線程阻塞于Selector調(diào)用,則線程的中斷標志位會被設(shè)置,同時阻塞的調(diào)用會立即返回。
  • InputStream的read調(diào)用,該操作是不可中斷的,如果流中沒有數(shù)據(jù),read會阻塞 (但線程狀態(tài)依然是RUNNABLE),且不響應interrupt(),與synchronized類似,調(diào)用interrupt()只會設(shè)置線程的中斷標志,而不會真正"中斷"。

3、關(guān)于中斷的經(jīng)驗

Java中取消/關(guān)閉線程技術(shù)是中斷,但它是一種協(xié)作機制,不會強制終止線程。線程在不同狀態(tài)IO操作時對中斷的反應有所不同。
作為線程的實現(xiàn)者:應該提供明確的取消/關(guān)閉方法,并用文檔描述清楚其行為。
作為線程的調(diào)用者:應該使用其取消/關(guān)閉方法,而不是貿(mào)然調(diào)用interrupt()方法。

到此這篇關(guān)于java中線程中斷的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)java 線程中斷內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何將Java與C#時間進行互相轉(zhuǎn)換

    如何將Java與C#時間進行互相轉(zhuǎn)換

    這篇文章主要介紹了Java與C#時間互轉(zhuǎn)的方法以及JAVA日期、C#日期計算說明,需要的朋友可以參考下
    2022-11-11
  • SpringBoot通過JSON傳遞請求參數(shù)的實例詳解

    SpringBoot通過JSON傳遞請求參數(shù)的實例詳解

    這篇文章主要介紹了SpringBoot通過JSON傳遞請求參數(shù),示例介紹SpringMVC如何通過JSON格式傳遞入?yún)?,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-11-11
  • SpringBoot自定義maven-plugin插件整合asm代碼插樁

    SpringBoot自定義maven-plugin插件整合asm代碼插樁

    本文主要介紹了SpringBoot自定義maven-plugin插件整合asm代碼插樁,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • SpringMVC通過攔截器實現(xiàn)IP黑名單

    SpringMVC通過攔截器實現(xiàn)IP黑名單

    這篇文章主要為大家詳細介紹了SpringMVC通過攔截器實現(xiàn)IP黑名單,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java死鎖代碼實例及產(chǎn)生死鎖必備的四個條件

    Java死鎖代碼實例及產(chǎn)生死鎖必備的四個條件

    這篇文章主要介紹了Java死鎖代碼實例及產(chǎn)生死鎖必備的四個條件,Java 發(fā)生死鎖的根本原因是,在申請鎖時發(fā)生了交叉閉環(huán)申請,synchronized在開發(fā)中最好不要嵌套使用,容易導致死鎖,需要的朋友可以參考下
    2024-01-01
  • java讀取word-excel-ppt文件代碼

    java讀取word-excel-ppt文件代碼

    OFFICE文檔使用POI控件,PDF可以使用PDFBOX0.7.3控件,完全支持中文,用XPDF也行,不過感覺PDFBOX比較好,而且作者也在更新。水平有限,萬望各位指正
    2009-04-04
  • Java緩沖字符流的實現(xiàn)示例

    Java緩沖字符流的實現(xiàn)示例

    本文詳細介紹了Java緩沖字符流的使用,通過使用BufferedReader和BufferedWriter,可以更高效地處理文本數(shù)據(jù),提高讀寫效率,感興趣的可以了解一下
    2024-12-12
  • 利用Java實現(xiàn)網(wǎng)站聚合工具

    利用Java實現(xiàn)網(wǎng)站聚合工具

    互聯(lián)網(wǎng)上有數(shù)以萬億計的網(wǎng)站,每個網(wǎng)站大都具有一定的功能。搜索引擎雖然對互聯(lián)網(wǎng)上的部分網(wǎng)站建立了索引,但是其作為一個大而全的搜索系統(tǒng),無法很好的定位到一些特殊的需求。因此本文將介紹一個用java實現(xiàn)的網(wǎng)站數(shù)據(jù)聚合工具,需要的可以參考一下
    2022-01-01
  • mybatis動態(tài)sql之Map參數(shù)的講解

    mybatis動態(tài)sql之Map參數(shù)的講解

    今天小編就為大家分享一篇關(guān)于mybatis動態(tài)sql之Map參數(shù)的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • package打包一個springcloud項目的某個微服務(wù)報錯問題

    package打包一個springcloud項目的某個微服務(wù)報錯問題

    這篇文章主要介紹了package打包一個springcloud項目的某個微服務(wù)報錯問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評論