Java怎樣結(jié)束一個線程

在Java中可以使用以下方法來結(jié)束一個線程:

java.lang.Thread類中包含了一些常用的方法藤树,如:start(),stop(),stop(Throwable),suspend(),destory(),resume()椿疗。通過這些方法灯节,我們可以對線程進行方便的操作靶溜,但是這些方法中所袁,只有start()方法得到了保留糟需。
在JDK幫助文檔以及Sun公司的一篇文章《Why are Thread stop,Thread suspend and Thread resume Deprecated旅赢?》中都講解了舍棄這些方法的原因。

簡單來說是因為:使用stop方法雖然可以 強行終止 正在運行或掛起的線程激捏,但使用stop方法是很危險的设塔,就像突然關(guān)閉計算機電源,而不是按正常程序關(guān)機一樣远舅,可能會產(chǎn)生不可預(yù)料的結(jié)果闰蛔,因此,并不推薦使用stop方法來終止線程图柏。

一序六、使用標志位

當run方法執(zhí)行完后,線程就會退出蚤吹。但是有時run方法是永遠不會結(jié)束的例诀,如在服務(wù)端程序中使用線程進行監(jiān)聽客戶端請求,或是其他的需要循環(huán)處理的任務(wù)距辆。

在線程的執(zhí)行邏輯中余佃,設(shè)置一個標志位來判斷是否需要終止線程,將標志位設(shè)置為true跨算,當外部需要終止線程時爆土,將標志位設(shè)置為false,將線程在下一次循環(huán)中檢查該標志位并主動退出循環(huán)從而結(jié)束線程诸蚕。

public class MyThread extends Thread {
    private volatile boolean isRunning = true;

    public void run() {
        while (isRunning) {
            // 線程執(zhí)行的邏輯
        }
    }

    public void stopThread() {
        isRunning = false;
    }
}

二步势、使用interrupt()方法+InterruptedException

如果一個線程由于等待某些事件的發(fā)生而被阻塞,又該怎樣停止該線程呢背犯?
這種情況經(jīng)常會發(fā)生坏瘩,比如當一個線程由于需要等候鍵盤輸入而被阻塞,或者調(diào)用Thread.join()方法漠魏,或者Thread.sleep()方法倔矾,在網(wǎng)絡(luò)中調(diào)用ServerSocket.accept()方法,或者調(diào)用了DatagramSocket.receive()方法時,都有可能導(dǎo)致線程阻塞哪自,使線程處于不可運行狀態(tài)時丰包,即使主線程中將該線程的共享變量設(shè)置為true,但該線程此時根本無法檢查循環(huán)標志壤巷,當然也就無法立即中斷邑彪。

這時建議不要使用stop()方法,而是使用Thread提供的interrupt()方法胧华,因為該方法雖然不會中斷一個正在運行的線程寄症,但是它可以 使一個被阻塞的線程拋出一個中斷異常,從而使線程提前結(jié)束阻塞狀態(tài)矩动,退出阻塞代碼

調(diào)用Thread類的interrupt()方法可以發(fā)送中斷信號給目標線程有巧。在線程的執(zhí)行邏輯中通過檢查isInterrupted()方法或捕獲InterruptException異常來響應(yīng)中斷信號并退出循環(huán)從而結(jié)束線程。

線程處于阻塞狀態(tài)铅忿,如Thread.sleep剪决、wait灵汪、IO阻塞等情況時檀训,調(diào)用interrupt方法后,sleep等方法將會拋出一個InterruptedException

public class MyThread extends Thread {

    public void run() {
        while (!isInterrupted()) {
            // 線程執(zhí)行的邏輯

            try {
                sleep(1000);
            } catch (InterruptedException e) {  // 捕獲 InterruptedException 異常
                break;  // 響應(yīng)中斷信號并退出循環(huán)
            }
        }
    }
}

// 終止線程:
myThread.interrupt();

請注意享言,在上述兩種方式中峻凫,第一種方式是通過自定義變量控制和終止線程序列;第二種方式是通過Java提供的interrupt機制向線程發(fā)送中斷信號览露,然后在線程內(nèi)部進行響應(yīng)荧琼。選擇合適的方式取決于具體需求和場景。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末差牛,一起剝皮案震驚了整個濱河市命锄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌偏化,老刑警劉巖脐恩,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異侦讨,居然都是意外死亡驶冒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門韵卤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骗污,“玉大人,你說我怎么就攤上這事沈条⌒璺蓿” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長屋厘。 經(jīng)常有香客問我汞扎,道長,這世上最難降的妖魔是什么擅这? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任澈魄,我火速辦了婚禮,結(jié)果婚禮上仲翎,老公的妹妹穿的比我還像新娘痹扇。我一直安慰自己,他們只是感情好溯香,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布鲫构。 她就那樣靜靜地躺著,像睡著了一般玫坛。 火紅的嫁衣襯著肌膚如雪结笨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天湿镀,我揣著相機與錄音炕吸,去河邊找鬼。 笑死勉痴,一個胖子當著我的面吹牛赫模,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒸矛,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼瀑罗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雏掠?” 一聲冷哼從身側(cè)響起斩祭,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乡话,沒想到半個月后摧玫,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蚊伞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年席赂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片时迫。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡颅停,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掠拳,到底是詐尸還是另有隱情癞揉,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站喊熟,受9級特大地震影響柏肪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芥牌,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一烦味、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壁拉,春花似錦谬俄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至痘昌,卻和暖如春钥勋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辆苔。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工算灸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姑子。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓乎婿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親街佑。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

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