成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

Thread中interrupt使用方法

FingerLiu / 3468人閱讀

摘要:合理中斷線(xiàn)程合理中斷在類(lèi)中提供了和方法這三個(gè)方法分別是用來(lái)結(jié)束暫?;謴?fù)線(xiàn)程但是都已經(jīng)被標(biāo)記為廢棄了因?yàn)橐粋€(gè)線(xiàn)程不應(yīng)該由其他線(xiàn)程來(lái)結(jié)束他應(yīng)該收到別人的通知然后自己在合適的位置結(jié)束如果不合理的結(jié)束會(huì)導(dǎo)致很多意外的結(jié)果比如臨界區(qū)還沒(méi)完全操作完提前

合理中斷線(xiàn)程 合理中斷

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

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

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

如果線(xiàn)程處于正常運(yùn)行狀態(tài),則還是正常運(yùn)行,但是中斷的標(biāo)志被設(shè)置為true,相當(dāng)于有人通知 你該結(jié)束自己了.

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

被調(diào)用線(xiàn)程不處于阻塞的時(shí)候,需要調(diào)用方法來(lái)監(jiān)控標(biāo)志.

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)得住
// ...

該程序會(huì)在檢測(cè)interrupt標(biāo)志,如果發(fā)現(xiàn)interrupt標(biāo)志設(shè)置為true,則會(huì)結(jié)束自己.

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

區(qū)別: 是否會(huì)清除interrupt標(biāo)志. isInterrupt()方法不會(huì)改變標(biāo)志,而interrupted()方法會(huì)在檢測(cè)的同時(shí),如果發(fā)現(xiàn)標(biāo)志為true,則會(huì)返回true,然后把標(biāo)志置為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

上面實(shí)例說(shuō)明Thread.interrupted()方法會(huì)在標(biāo)志為true的情況下修改interrupted的標(biāo)志.

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
源碼解析

通過(guò)觀(guān)察源碼可以看出interrupted方法最后會(huì)調(diào)用isInterrupted(true)方法,而傳入的參數(shù)代表是否清除標(biāo)志位. 可以看到isInterrupted(boolean)是一個(gè)本地方法,最終會(huì)通過(guò)C/C++來(lái)執(zhí)行. 而isInterrupted()最后傳入的參數(shù)為false,說(shuō)明不清除標(biāo)志位.

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/77706.html

相關(guān)文章

  • (三)從jvm層面了解線(xiàn)程的啟動(dòng)和停止

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

    mudiyouyou 評(píng)論0 收藏0
  • Thread類(lèi)源碼解讀(3)——線(xiàn)程interrupt

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

    fevin 評(píng)論0 收藏0
  • java線(xiàn)程池的生命周期與線(xiàn)程

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

    suxier 評(píng)論0 收藏0
  • 線(xiàn)程的斷 - Interrupts

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

    chenatu 評(píng)論0 收藏0
  • Java Executors 源碼分析

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

    itvincent 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<