1207-Thread:如何中止一個(gè)線程

<br />

當(dāng)前組件銷毀時(shí)锌奴,后臺(tái)線程同樣需要中止兽狭,否則仍會(huì)在內(nèi)存中運(yùn)行,這就造成內(nèi)存泄漏。

線程對(duì)象屬于一次性消耗品箕慧,一般線程執(zhí)行完run方法之后服球,線程就正常結(jié)束了,線程結(jié)束之后就報(bào)廢了颠焦,不能再次start斩熊,只能新建一個(gè)線程對(duì)象。但有時(shí)run方法是永遠(yuǎn)不會(huì)結(jié)束的伐庭。例如在程序中使用線程進(jìn)行Socket監(jiān)聽(tīng)請(qǐng)求粉渠,或是其他的需要循環(huán)處理的任務(wù)。在這種情況下圾另,一般是將這些任務(wù)放在一個(gè)循環(huán)中渣叛,如while循環(huán)。當(dāng)需要結(jié)束線程時(shí)盯捌,如何退出線程呢淳衙?

有三種方法可以結(jié)束線程:

  1. 使用退出標(biāo)志,使線程正常退出饺著,也就是當(dāng)run方法完成后線程終止
  2. 使用interrupt()方法中斷線程
  3. 使用stop方法強(qiáng)行終止線程(不推薦使用箫攀,可能發(fā)生不可預(yù)料的結(jié)果)

前兩種方法都可以實(shí)現(xiàn)線程的正常退出,而第三種方法相當(dāng)于電腦斷電關(guān)機(jī)一樣幼衰,是不安全的方法靴跛。

<br />

使用退出標(biāo)志終止線程

<br />

使用一個(gè)變量來(lái)控制循環(huán),例如最直接的方法就是設(shè)一個(gè)boolean類型的標(biāo)志渡嚣,并通過(guò)設(shè)置這個(gè)標(biāo)志為true或false來(lái)控制while循環(huán)是否退出梢睛。

public class ThreadSafe extends Thread {  
    public volatile boolean exit = false;   
        public void run() {   
        while (!exit){  
            //do something  
        }  
    }   
} 

<br />

使用interrupt()方法終止線程

<br />

使用interrupt()方法來(lái)終端線程可分為兩種情況

線程處于阻塞狀態(tài)

如使用了sleep,同步鎖的wait识椰,socket的receiver绝葡,accept等方法時(shí),會(huì)使線程處于阻塞狀態(tài)腹鹉。當(dāng)調(diào)用線程的interrupt()方法時(shí)藏畅,系統(tǒng)會(huì)拋出一個(gè)InterruptedException異常,代碼中通過(guò)捕獲異常功咒,然后break跳出循環(huán)狀態(tài)愉阎,使線程正常結(jié)束。

通常很多人認(rèn)為只要調(diào)用interrupt方法線程就會(huì)結(jié)束力奋,實(shí)際上是錯(cuò)的榜旦,一定要先捕獲InterruptedException異常之后通過(guò)break來(lái)跳出循環(huán),才能正常結(jié)束run方法景殷。

public class ThreadSafe extends Thread {  
    public void run() {   
        while (true) {  
            try {  
                Thread.sleep(5*1000); //阻塞5妙  
            } catch(InterruptedException e) {  
                e.printStackTrace();  
                break; //捕獲到異常之后溅呢,執(zhí)行break跳出循環(huán)锉走。  
            }  
        }  
    }   
}  

線程未進(jìn)入阻塞狀態(tài)

使用isInterrupted()判斷線程的中斷標(biāo)志來(lái)退出循環(huán),當(dāng)使用interrupt()方法時(shí)藕届,中斷標(biāo)志就會(huì)置true,和使用自定義的標(biāo)志來(lái)控制循環(huán)是一樣的道理亭饵。

public class ThreadSafe extends Thread {  
    public void run() {   
        while (!isInterrupted()){  
            //do something  
        }  
    }   
}  

<br />

為什么要區(qū)分阻塞狀態(tài)和和非阻塞狀態(tài)兩種情況休偶,是因?yàn)楫?dāng)阻塞狀態(tài)時(shí),如果有interrupt()發(fā)生辜羊,系統(tǒng)除了會(huì)拋出InterruptedException異常外踏兜,還會(huì)調(diào)用interrupted()函數(shù),調(diào)用前中斷狀態(tài)是true八秃,調(diào)用之后會(huì)復(fù)位中斷狀態(tài)為false碱妆,所以異常拋出之后通過(guò)isInterrupted()是獲取不到中斷狀態(tài)是true的狀態(tài),從而不能退出循環(huán)昔驱,因此在線程未進(jìn)入阻塞的代碼段時(shí)是可以通過(guò)isInterrupted()來(lái)判斷中斷是否發(fā)生來(lái)控制循環(huán)疹尾,在進(jìn)入阻塞狀態(tài)后要通過(guò)捕獲異常來(lái)退出循環(huán)。

因此使用interrupt()來(lái)退出線程的最好的方式應(yīng)該是兩種情況都要考慮.

public class ThreadSafe extends Thread {  
    public void run() {   
        while (!isInterrupted()) { //非阻塞過(guò)程中通過(guò)判斷中斷標(biāo)志來(lái)退出  
            try {  
                Thread.sleep(5*1000)骤肛;//阻塞過(guò)程捕獲中斷異常來(lái)退出  
            } catch(InterruptedException e) {  
                e.printStackTrace();  
                break; //捕獲到異常之后纳本,執(zhí)行break跳出循環(huán)。  
            }  
        }  
    }   
}   

<br />

問(wèn)題:用interupt方法腋颠,能不能中止一個(gè)網(wǎng)絡(luò)請(qǐng)求繁成?為什么?
<br />

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末淑玫,一起剝皮案震驚了整個(gè)濱河市巾腕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌絮蒿,老刑警劉巖尊搬,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異土涝,居然都是意外死亡毁嗦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)回铛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狗准,“玉大人,你說(shuō)我怎么就攤上這事茵肃∏怀ぃ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵验残,是天一觀的道長(zhǎng)捞附。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么鸟召? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任胆绊,我火速辦了婚禮,結(jié)果婚禮上欧募,老公的妹妹穿的比我還像新娘压状。我一直安慰自己,他們只是感情好跟继,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布种冬。 她就那樣靜靜地躺著,像睡著了一般舔糖。 火紅的嫁衣襯著肌膚如雪娱两。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天金吗,我揣著相機(jī)與錄音十兢,去河邊找鬼。 笑死摇庙,一個(gè)胖子當(dāng)著我的面吹牛纪挎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跟匆,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼异袄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了玛臂?” 一聲冷哼從身側(cè)響起烤蜕,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎迹冤,沒(méi)想到半個(gè)月后讽营,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泡徙,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年橱鹏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堪藐。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡莉兰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出礁竞,到底是詐尸還是另有隱情糖荒,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布模捂,位于F島的核電站捶朵,受9級(jí)特大地震影響蜘矢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜综看,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一品腹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧红碑,春花似錦舞吭、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)兔毙。三九已至唾琼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澎剥,已是汗流浹背锡溯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哑姚,地道東北人祭饭。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叙量,于是被迫代替她去往敵國(guó)和親倡蝙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • 下面是我自己收集整理的Java線程相關(guān)的面試題绞佩,可以用它來(lái)好好準(zhǔn)備面試寺鸥。 參考文檔:-《Java核心技術(shù) 卷一》-...
    阿呆變Geek閱讀 14,738評(píng)論 14 507
  • 概要本章,會(huì)對(duì)線程的interrupt()中斷和終止方式進(jìn)行介紹品山。涉及到的內(nèi)容包括: interrupt()說(shuō)明 ...
    博格體閱讀 437評(píng)論 0 3
  • 第三章 Java內(nèi)存模型 3.1 Java內(nèi)存模型的基礎(chǔ) 通信在共享內(nèi)存的模型里胆建,通過(guò)寫(xiě)-讀內(nèi)存中的公共狀態(tài)進(jìn)行隱...
    澤毛閱讀 4,341評(píng)論 2 22
  • 一、并發(fā) 進(jìn)程:每個(gè)進(jìn)程都擁有自己的一套變量 線程:線程之間共享數(shù)據(jù) 1.線程 Java中為多線程任務(wù)提供了很多的...
    SeanMa閱讀 2,405評(píng)論 0 11
  • 日間無(wú)聊肘交,因憶幼時(shí)所聞之異事笆载,錄而志之,題曰《蜀客談異錄》涯呻。孟浪之言凉驻,未免有違夫子不語(yǔ)之教也。 ...
    請(qǐng)恕醉人閱讀 430評(píng)論 0 2