多線程系列09-線程終止與線程中斷

線程終止:
在Thread類中JDK給我們提供了一個(gè)終止線程的方法stop(); 該方法一經(jīng)調(diào)用就會(huì)立即終止該線程,并立即釋放對(duì)象鎖。如果當(dāng)一個(gè)線程執(zhí)行一半業(yè)務(wù)而調(diào)用了該方法华糖,可能就會(huì)產(chǎn)生數(shù)據(jù)不一致問(wèn)題。
線程中斷:
線程中斷就是讓目標(biāo)線程停止執(zhí)行,但它不會(huì)使線程立即終止缤剧,而是給線程發(fā)送一個(gè)通知,告訴線程jvm希望你退出執(zhí)行域慷,至于目標(biāo)線程何時(shí)退出荒辕,則完全由它自己決定(如果立即停止,會(huì)造成與stop一樣的問(wèn)題)犹褒。

JDK中線程中斷的3個(gè)相關(guān)方法:

//線程中斷 
public void interrupt(){}
//判斷線程是否中斷
public boolean isInterrupted() {}
//判斷線程是否中斷抵窒,并清除當(dāng)前中斷狀態(tài)
public static boolean interrupted(){}
  1. 中斷處于阻塞狀態(tài)(sleep() / join ()/wait())的線程
 public static native void sleep(long millis) throws InterruptedException;

看源碼可知sleep() 方法 InterruptedException 中斷異常,該異常不是運(yùn)行時(shí)異常叠骑,所以需要捕獲它李皇,當(dāng)線程在執(zhí)行sleep()時(shí),如果發(fā)生線程中斷座云,這個(gè)異常就會(huì)產(chǎn)生疙赠。該異常一旦拋出就會(huì)清除中斷狀態(tài)。
并且朦拖,對(duì)InterruptedException的捕獲務(wù)一般放在while(true)循環(huán)體的外面圃阳,這樣,在產(chǎn)生異常時(shí)就退出了while(true)循環(huán)璧帝。否則捍岳,InterruptedException在while(true)循環(huán)體之內(nèi),就需要額外的添加退出處理。
常用方式:

@Override
public void run() {
    try {
        while (true) {
            // 執(zhí)行任務(wù)...
        }
    } catch (InterruptedException ie) {  
        // 由于產(chǎn)生InterruptedException異常锣夹,退出while(true)循環(huán)页徐,線程終止!
    }
}
  1. 中斷處于運(yùn)行狀態(tài)的線程
    通常银萍,我們通過(guò)“標(biāo)記”方式中斷處于“運(yùn)行狀態(tài)”的線程变勇。包括“中斷標(biāo)記”與“額外添加標(biāo)記”。
    中斷標(biāo)記方式:
@Override
public void run() {
    while (!isInterrupted()) {
        // 執(zhí)行任務(wù)...
    }
}

額外添加標(biāo)記:

private volatile boolean flag= true;
protected void stopTask() {
    flag = false;
}

@Override
public void run() {
    while (flag) {
        // 執(zhí)行任務(wù)...
    }
}

綜上贴唇,比較通用的終止線程的方式:

@Override
public void run() {
    try {
        // 1. isInterrupted()保證搀绣,只要中斷標(biāo)記為true就終止線程。
        while (!isInterrupted()) {
            // 執(zhí)行任務(wù)...
        }
    } catch (InterruptedException ie) {  
        // 2. InterruptedException異常保證戳气,當(dāng)InterruptedException異常產(chǎn)生時(shí)链患,線程被終止。
    }
}

示例:

public class Demo1 {

    static class MyThread extends Thread{
        public MyThread(String name){
            super(name);
        }

        @Override
        public void run(){
            try{
                int i = 0;
                while(!isInterrupted()){
                    Thread.sleep(100);
                    i++;
                    System.out.println(Thread.currentThread().getName()+" ("+this.getState()+") loop " + i);
                }
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread().getName() +" ("+this.getState()+") catch InterruptedException.");
            }
        }

    }

    public static void main(String[] args) {

        try {
            MyThread myThread = new MyThread("myThread");
            System.out.println(myThread.getName() +" ("+myThread.getState()+") is new.");

            myThread.start();
            System.out.println(myThread.getName() +" ("+myThread.getState()+") is started.");

            //主線程休眠300ms瓶您,然后給主線程發(fā)出"中斷"指令
            Thread.sleep(300);
            myThread.interrupt();
            System.out.println(myThread.getName() +" ("+myThread.getState()+") is interrupted.");

            //主線程休眠300ms麻捻,然后查看myThread狀態(tài)
            Thread.sleep(300);
            System.out.println(myThread.getName() +" ("+myThread.getState()+") is interrupted now.");

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市呀袱,隨后出現(xiàn)的幾起案子贸毕,更是在濱河造成了極大的恐慌,老刑警劉巖压鉴,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件崖咨,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡油吭,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門署拟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)婉宰,“玉大人,你說(shuō)我怎么就攤上這事推穷⌒陌” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵馒铃,是天一觀的道長(zhǎng)蟹腾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)区宇,這世上最難降的妖魔是什么娃殖? 我笑而不...
    開(kāi)封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮议谷,結(jié)果婚禮上炉爆,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好芬首,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布赴捞。 她就那樣靜靜地躺著,像睡著了一般郁稍。 火紅的嫁衣襯著肌膚如雪赦政。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天耀怜,我揣著相機(jī)與錄音昼钻,去河邊找鬼。 笑死封寞,一個(gè)胖子當(dāng)著我的面吹牛然评,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播狈究,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼碗淌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了抖锥?” 一聲冷哼從身側(cè)響起亿眠,我...
    開(kāi)封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎磅废,沒(méi)想到半個(gè)月后纳像,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拯勉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年竟趾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宫峦。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岔帽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出导绷,到底是詐尸還是另有隱情犀勒,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布妥曲,位于F島的核電站贾费,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏檐盟。R本人自食惡果不足惜褂萧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一遵堵、第九天 我趴在偏房一處隱蔽的房頂上張望箱玷。 院中可真熱鬧怨规,春花似錦、人聲如沸锡足。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舶得。三九已至掰烟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沐批,已是汗流浹背纫骑。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留九孩,地道東北人先馆。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像躺彬,于是被迫代替她去往敵國(guó)和親煤墙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容