成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Thread中interrupt使用方法

FingerLiu / 3435人閱讀

摘要:合理中斷線程合理中斷在類中提供了和方法這三個方法分別是用來結束暫停恢復線程但是都已經被標記為廢棄了因為一個線程不應該由其他線程來結束他應該收到別人的通知然后自己在合適的位置結束如果不合理的結束會導致很多意外的結果比如臨界區(qū)還沒完全操作完提前

合理中斷線程 合理中斷

Thread類中,提供了stop(),suspend()resume()方法,這三個方法分別是用來結束,暫停,恢復線程. 但是都已經被標記為@Deprecated廢棄了. 因為一個線程不應該由其他線程來結束,他應該收到別人的通知,然后自己在合適的位置結束,如果不合理的結束,會導致很多意外的結果,比如臨界區(qū)還沒完全操作完,提前釋放鎖,但是部分狀態(tài)已經改變,還有沒有做一些清理操作等等.

基于上面的理由,Java提供了新的中斷機制(interrupt),其他線程調用想要終止線程的interrupt()方法. 這個時候線程會根據(jù)自己的狀態(tài)做出響應:

如果線程處于阻塞狀態(tài)(sleep,wait,join),則線程會拋出InterruptedException異常.

如果線程處于正常運行狀態(tài),則還是正常運行,但是中斷的標志被設置為true,相當于有人通知 你該結束自己了.

被調用線程處于阻塞狀態(tài)
public static void main(String[] args) {
    Thread thread = new Thread() {
        @Override
        public void run() {
            try {
                // 被調線程阻塞自己30s
                sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    try {
        // 啟動線程
        thread.start();
        // 主線程阻塞自己3秒
        TimeUnit.SECONDS.sleep(3);
        // 中斷線程
        thread.interrupt();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
// ↓ out ↓
// java.lang.InterruptedException: sleep interrupted
// ...
被調用線程處于正常運行

被調用線程不處于阻塞的時候,需要調用方法來監(jiān)控標志.

public static void main(String[] args) {
    Thread thread = new Thread() {
        @Override
        public void run() {
            while (!Thread.interrupted()) {
                System.out.println("我還穩(wěn)得住...");
            }
        }
    };
    try {
        thread.start();
        TimeUnit.SECONDS.sleep(3);
        thread.interrupt();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

// ↓ out ↓
// 我能穩(wěn)得住
// ...

該程序會在檢測interrupt標志,如果發(fā)現(xiàn)interrupt標志設置為true,則會結束自己.

interrupted()和isInterrupt()的區(qū)別

區(qū)別: 是否會清除interrupt標志. isInterrupt()方法不會改變標志,而interrupted()方法會在檢測的同時,如果發(fā)現(xiàn)標志為true,則會返回true,然后把標志置為false.

public static void main(String[] args) {
    Thread thread = new Thread() {
        @Override
        public void run() {
            while (!Thread.interrupted()) {
                System.out.println("我還穩(wěn)得住...");
            }
            // ????添加下面代碼????
            System.out.println(Thread.interrupted());
        }
    };
    try {
        thread.start();
        TimeUnit.SECONDS.sleep(3);
        thread.interrupt();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

// ↓ out ↓
// 我還穩(wěn)得住...
// ...(省略)
// false

上面實例說明Thread.interrupted()方法會在標志為true的情況下修改interrupted的標志.

public static void main(String[] args) {
    Thread thread = new Thread() {
        @Override
        public void run() {
            // ????修改方法????
            while (!isInterrupted()) {
                System.out.println("我還穩(wěn)得住...");
            }
            System.out.println(Thread.interrupted());
        }
    };
    try {
        thread.start();
        TimeUnit.SECONDS.sleep(3);
        thread.interrupt();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

// ↓ out ↓
// 我還穩(wěn)得住...
// ...(省略)
// true
源碼解析

通過觀察源碼可以看出interrupted方法最后會調用isInterrupted(true)方法,而傳入的參數(shù)代表是否清除標志位. 可以看到isInterrupted(boolean)是一個本地方法,最終會通過C/C++來執(zhí)行. 而isInterrupted()最后傳入的參數(shù)為false,說明不清除標志位.

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/77706.html

相關文章

  • (三)從jvm層面了解線程的啟動和停止

    摘要:最后我們重點關注與一下實際就是調用平臺創(chuàng)建線程的方法來創(chuàng)建線程。線程的中斷標識判斷了解了方法的作用以后,再回過頭來看中這段代碼,就很好理解了。 文章簡介 這一篇主要圍繞線程狀態(tài)控制相關的操作分析線程的原理,比如線程的中斷、線程的通信等,內容比較多,可能會分兩篇文章 內容導航 線程的啟動的實現(xiàn)原理 線程停止的實現(xiàn)原理分析 為什么中斷線程會拋出InterruptedException ...

    mudiyouyou 評論0 收藏0
  • Thread類源碼解讀(3)——線程interrupt

    摘要:現(xiàn)在終止一個線程,基本上只能靠曲線救國式的中斷來實現(xiàn)。中斷機制的核心在于中斷狀態(tài)和異常中斷狀態(tài)設置一個中斷狀態(tài)清除一個中斷狀態(tài)方法同時會返回線程原來的中斷的狀態(tài)。中斷異常中斷異常一般是線程被中斷后,在一些類型的方法如中拋出。 前言 系列文章目錄 線程中斷是一個很重要的概念,通常,取消一個任務的執(zhí)行,最好的,同時也是最合理的方法,就是通過中斷。 本篇我們主要還是通過源碼分析來看看中斷的概...

    fevin 評論0 收藏0
  • java線程池的生命周期與線程

    摘要:線程中斷線程中斷就是一種協(xié)作機制。它并不會真正的中斷一個正在運行的線程,而只是發(fā)出中斷請求,然后由線程在下一個合適的時刻中斷自己。 線程池生命周期包括: RUNNING:接收新的任務并處理隊列中的任務 SHUTDOWN:不接收新的任務,但是處理隊列中的任務 STOP:不接收新的任務,不處理隊列中的任務,同時中斷處理中的任務 TIDYING:所有的任務處理完成,有效的線程數(shù)是0 TER...

    suxier 評論0 收藏0
  • 線程的斷 - Interrupts

    摘要:我們通常使用中斷去終止線程如何中斷線程調用,向線程發(fā)送指示。當獲取到指示時,這些方法將拋出異常。捕獲這個異常,并即可中斷線程。 Interrupt ? An interrupt is an indication to a thread that it should stop what it is doing and do something else. 中斷(interupt)是一個指...

    chenatu 評論0 收藏0
  • Java Executors 源碼分析

    摘要:表示一個異步任務的結果,就是向線程池提交一個任務后,它會返回對應的對象。它們分別提供兩個重要的功能阻塞當前線程等待一段時間直到完成或者異常終止取消任務。此時,線程從中返回,然后檢查當前的狀態(tài)已經被改變,隨后退出循環(huán)。 0 引言 前段時間需要把一個C++的項目port到Java中,因此時隔三年后重新熟悉了下Java。由于需要一個通用的線程池,自然而然就想到了Executors。 用了...

    itvincent 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<