線(xiàn)程中斷

中斷可以理解為線(xiàn)程的一個(gè)標(biāo)識(shí)位屬性,它表示一個(gè)運(yùn)行中的線(xiàn)程是否被其他線(xiàn)程進(jìn)行了中斷。

中斷只是通知一下該線(xiàn)程,但是不強(qiáng)制停止。如果響應(yīng)中斷時(shí)不做處理,該線(xiàn)程還是會(huì)繼續(xù)運(yùn)行下去的。

中斷好比其他線(xiàn)程給該線(xiàn)程打了個(gè)招呼調(diào)用該線(xiàn)程的interrupt()方法
該線(xiàn)程可以判斷自己是否被中斷線(xiàn)程內(nèi)部調(diào)用isInterrupted()方法,被中斷返回true
該線(xiàn)程可以對(duì)中斷標(biāo)識(shí)位進(jìn)行復(fù)位線(xiàn)程內(nèi)部調(diào)用靜態(tài)方法Thread.interrupted()方法

public class Interruped {
    public static void main(String[] args) throws InterruptedException {
        Thread runner = new Thread(new Runner(),"thread01");
        runner.start();
        // 讓該線(xiàn)程充分運(yùn)行
        TimeUnit.SECONDS.sleep(5);
        
        // 通知該線(xiàn)程可以停止了
        runner.interrupt();
    }
    
    static class Runner implements Runnable{
        @Override
        public void run(){
            while(true){
                // 通過(guò)isInterrupted()判斷當(dāng)前線(xiàn)程是否被中斷
                if (Thread.currentThread().isInterrupted()) {
                   System.out.println(Thread.currentThread().getName() + ": 被中斷了");
                   // 對(duì)中斷標(biāo)識(shí)位進(jìn)行復(fù)位
                   Thread.interrupted();
                }
            }
        }
    }

}

在拋出InterruptException之前,虛擬機(jī)會(huì)將該線(xiàn)程的中斷標(biāo)識(shí)位清除。此時(shí)如果調(diào)用isInterrupt()方法會(huì)返回false。

public class Interruped {
    public static void main(String[] args) throws InterruptedException {
        Thread sleepRunner = new Thread(new SleepRunner(),"sleepThread");
        Thread busyRunner = new Thread(new BusyRunner(),"busyThread");
        
        sleepRunner.start();
        busyRunner.start();
        
        // 這個(gè)很重要,要先讓線(xiàn)程跑起來(lái)
        TimeUnit.SECONDS.sleep(5);
        
        sleepRunner.interrupt();
        busyRunner.interrupt();
        
        System.out.println("sleepThread is" + sleepRunner.isInterrupted());
        System.out.println("busyThread is" + busyRunner.isInterrupted());
    }
    // 該類(lèi)拋出中斷異常
    static class SleepRunner implements Runnable{
        @Override
        public void run() {
            while(true){
                try {
                    Thread.sleep(10*1000);
                } catch (InterruptedException e) {
                }
            }
        }
    }

        // 該類(lèi)不拋出異常
    static class BusyRunner implements Runnable{
        @Override
        public void run() {
            while(true){
            }
        }
    }
}

sleepThread is false // 拋出異常的線(xiàn)程中斷標(biāo)識(shí)位被清除
busyThread is true // 沒(méi)有拋出異常的線(xiàn)程沒(méi)有被清除


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前面的幾篇文章主要介紹了線(xiàn)程的一些最基本的概念,包括線(xiàn)程的間的沖突及其解決辦法,以及線(xiàn)程間的協(xié)作機(jī)制。本篇主要來(lái)學(xué)...
    Single_YAM閱讀 543評(píng)論 0 3
  • 中斷線(xiàn)程 thread.interrupt()用來(lái)中斷線(xiàn)程,即將線(xiàn)程的中斷狀態(tài)位設(shè)置為true,注意中斷操作并不會(huì)...
    劉建會(huì)閱讀 2,616評(píng)論 0 1
  • 前言 本文主要集中在Java線(xiàn)程的中斷的使用和操作上.完整代碼:代碼 方法 關(guān)于中斷的有三個(gè)方法都在java.la...
    nicktming閱讀 542評(píng)論 0 1
  • 內(nèi)容完全來(lái)自于《java核心技術(shù)卷Ⅰ 》 當(dāng)線(xiàn)程的run方法執(zhí)行方法體中最后一條語(yǔ)句后,并經(jīng)由執(zhí)行return語(yǔ)句...
    HWilliamgo閱讀 650評(píng)論 0 0
  • 什么是線(xiàn)程中斷 Java中斷機(jī)制是一種協(xié)作機(jī)制,也就是說(shuō)通過(guò)中斷并不能直接終止另一個(gè)線(xiàn)程,而需要被中斷的線(xiàn)程自己處...
    驪驊閱讀 610評(píng)論 0 1

友情鏈接更多精彩內(nèi)容