91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java中斷和終止線程的方法

發布時間:2020-06-23 18:00:50 來源:億速云 閱讀:149 作者:元一 欄目:編程語言

這篇文章將為大家詳細講解有關java中斷和終止線程的方法,文章內容質量較高,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

中斷線程

線程中斷僅僅是置線程的中斷狀態位,并不會停止線程。支持線程中斷的方法也就是線程中斷后會拋出interruptedException的方法)就是在監視線程的中斷狀態,比如sleep、join等,一旦線程的中斷狀態被置為“中斷狀態”,就會拋出中斷異常,并且將中斷標志重新置為false。所以在Java中設置線程的中斷狀態位并不會產生對線程運行的實際影響,而是通過監視線程的狀態位并做相應處理,或者通過拋出中斷異常(InterruptedException)來通知用戶進行處理。

終止線程

當調用線程的start方法之后,線程會開始驅動任務,當任務執行完畢之后(也就是run方法執行結束)線程將終止,但是如果因為線程阻塞或者線程長時間執行而不能結束,所以我們希望能夠通過某種途徑可以終止線程以達到想要的效果,常用的方式有兩種:中斷、檢查中斷。

1、interrupt()isInterrupted()interrupted()的作用

中斷就是線程的一個標識位,它表示一個運行中的線程是否被其他線程調用了中斷操作,其他線程可以通過調用線程的interrupt()方法對其進行中斷操作,線程可以通過調用isInterrupted()方法判斷是否被中斷,線程也可以通過調用Threadinterrupted()靜態方法對當前線程的中斷標識位進行復位。

注意:不要認為調用了線程的interrupt()方法,該線程就會停止,它只是做了一個標志位。

如下:

public class InterruptThread extends Thread{
    @Override
    public void run() {
        //一個死循環
        while (true){
            System.out.println("InterruptThread正在執行");
        }
    }
}

public static void main(String[] args) throws InterruptedException {
    InterruptThread interruptThread = new InterruptThread();
    interruptThread.start();
    interruptThread.interrupt();//調用線程的interrupt()
    System.out.println("interruptThread是否被中斷,interrupt  = " + interruptThread.isInterrupted());
    //此時isInterrupted()方法返回true
}

輸出結果:
interruptThread是否被中斷,interrupt  = true
InterruptThread正在執行
InterruptThread正在執行
InterruptThread正在執行
//...

可以看到當你調用了線程的interrupt()方法后,此時調用isInterrupted()方法會返回true,但是該線程還是會繼續執行下去。所以怎么樣才能終止一個線程的運行呢?

2、終止線程的運行

一個線程正常執行完run方法之后會自動結束,如果在運行過程中發生異常也會提前結束;所以利用這兩種情況,我們還可以通過以下三種種方式安全的終止運行中的線程:

2.1、利用中斷標志位

前面講到的中斷操作就可以用來取消線程任務,如下:

public class InterruptThread extends Thread{
    @Override
    public void run() {
        while (!isInterrupted()){//利用中斷標記位
            System.out.println("InterruptThread正在執行");
        }
    }
}

當不需要運行InterruptThread線程時,通過調用InterruptThread.interrupt()使得isInterrupted()返回true,就可以讓線程退出循環,正常執行完畢之后自動結束。

2.2、利用一個boolean變量

利用一個boolean變量和上述方法同理,如下:

public class InterruptThread extends Thread{
    
    private volatile boolean isCancel;

    @Override
    public void run() {
        while (!isCancel){//利用boolean變量
            System.out.println("InterruptThread正在執行");
        }
    }

    public void cancel(){
        isCancel = true;
    }
}

當不需要運行InterruptThread線程時,通過調用InterruptThread.cancel()使isCancel等于true,就可以讓線程退出循環,正常執行完畢之后自動結束,這里要注意boolean變量要用volatile修飾保證內存的可見性。

2.3、響應InterruptedException

通過調用一個線程的 interrupt() 來中斷該線程時,如果該線程處于阻塞、限期等待或者無限期等待狀態,那么就會拋出 InterruptedException,從而提前結束該線程,例如當你調用Thread.sleep()方法時,通常會讓你捕獲一個InterruptedException異常,如下:

public class InterruptThread extends Thread{
    @Override
    public void run() {
        try{
            while (true){
                Thread.sleep(100);//Thread.sleep會拋出InterruptedException
                System.out.println("InterruptThread正在執行");
            }
        }catch (InterruptedException e){
            e.printStackTrace();
        }
    }
}

當不需要運行InterruptThread線程時,通過調用InterruptThread.interrupt()使得 Thread.sleep() 拋出InterruptedException,就可以讓線程退出循環,提前結束。在拋出InterruptedException異常之前,JVM會把中斷標識位復位,此時調用線程的isInterrupted()方法將會返回false。

以上就是java中斷和終止線程的方法,看完之后是否有所收獲呢?如果想了解更多相關內容,歡迎關注億速云行業資訊,感謝各位的閱讀。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阿巴嘎旗| 施甸县| 加查县| 寻甸| 潢川县| 恭城| 巴里| 社旗县| 乌恰县| 神木县| 祁东县| 衡东县| 北安市| 湘乡市| 澜沧| 呼和浩特市| 邓州市| 乌兰浩特市| 浑源县| 高州市| 兴山县| 石景山区| 开平市| 昌江| 中卫市| 安泽县| 安岳县| 皋兰县| 巴林右旗| 固始县| 泌阳县| 河池市| 腾冲县| 福建省| 富锦市| 邢台县| 丰原市| 吉隆县| 定陶县| 上虞市| 凤庆县|