如何優(yōu)雅的"中斷"一個(gè)線程执桌?

線程的啟動(dòng)過程大家都非常熟悉鄙皇,但是如何終止一個(gè)線程,我相信絕大部分人在面試的時(shí)候被問到這個(gè)問題時(shí)仰挣,也會(huì)不知所措伴逸,不知道怎么回答。

記住膘壶,線程的終止错蝴,并不是簡單的調(diào)用 stop 命令去洲愤。雖然 api 仍然可以調(diào)用,但是和其他的線程控制方法如 suspend顷锰、resume 一樣都是過期了的不建議使用柬赐,就拿stop 來說,stop 方法在結(jié)束一個(gè)線程時(shí)并不會(huì)保證線程的資源正常釋放官紫,因此會(huì)導(dǎo)致程序可能出現(xiàn)一些不確定的狀態(tài)肛宋。

要優(yōu)雅的去中斷一個(gè)線程,在線程中提供了一個(gè) interrupt 方法束世。

interrupt 方法

當(dāng)其他線程通過調(diào)用當(dāng)前線程的 interrupt 方法酝陈,表示向當(dāng)前線程打個(gè)招呼,告訴他可以中斷線程的執(zhí)行了良狈,至于什么時(shí)候中斷后添,取決于當(dāng)前線程自己。 線程通過檢查資深是否被中斷來進(jìn)行相應(yīng)薪丁,可以通過 isInterrupted()來判斷是否被中斷遇西。
通過下面這個(gè)例子,來實(shí)現(xiàn)了線程終止的邏輯 :

public class ThreadInterruptDemo {

   /* public static void main(String[] args) throws InterruptedException {
        Thread thred=new Thread(()->{
            while(true){
                boolean in=Thread.currentThread().isInterrupted();
                if(in){
                    System.out.println("before:"+in);
                    Thread.interrupted();//設(shè)置復(fù)位
                    System.out.println("after:"+Thread.currentThread().isInterrupted());
                }
            }
        });
        thred.start();
        TimeUnit.SECONDS.sleep(1);
        thred.interrupt(); //終端
    }*/

   /* public static void main(String[] args) throws InterruptedException {
        Thread thread=new Thread(()->{
            while(true){
                try {
                    Thread.sleep(10000000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
        TimeUnit.SECONDS.sleep(1);
        thread.interrupt();
        System.out.println("before:"+thread.isInterrupted());
        TimeUnit.SECONDS.sleep(1);
        System.out.println("after:"+thread.isInterrupted());
    }*/
//   volatile boolean stop=true;
}

這種通過標(biāo)識(shí)位或者中斷操作的方式能夠使線程在終止時(shí)有機(jī)會(huì)去清理資源严嗜,而不是武斷地將線程停止粱檀,因此這種終止線程的做法顯得更加安全和優(yōu)雅.

通過 interrupt,設(shè)置了一個(gè)標(biāo)識(shí)告訴線程可以終止了漫玄,線程中還提供了靜態(tài)方法 Thread.interrupted()對設(shè)置中斷標(biāo)識(shí)的線程復(fù)位茄蚯。比如在上面的案例中,外面的線程調(diào)用 thread.interrupt 來設(shè)置中斷標(biāo)識(shí)睦优,而在線程里面渗常,又通過Thread.interrupted 把線程的標(biāo)識(shí)又進(jìn)行了復(fù)位 .


image.png

除了通過Thread.interrupted 方法對線程中斷標(biāo)識(shí)進(jìn)行復(fù)位以外,還有一種被動(dòng)復(fù)位的場景汗盘,就是對拋出 InterruptedException 異常的方法皱碘,在InterruptedException 拋出之前,JVM 會(huì)先把線程的中斷標(biāo)識(shí)位清除隐孽,然后才會(huì)拋出InterruptedException癌椿,這個(gè)時(shí)候如果調(diào)用 isInterrupted 方法,將會(huì)返回false .


image.png

我們可以看下jvm中的源代碼菱阵,看下1為什么要復(fù)位踢俄。


image.png

image.png

可以看到,其實(shí)就是通過unpark 去喚醒當(dāng)前線程晴及,并且設(shè)置一個(gè)標(biāo)識(shí)位為 true都办。 并沒有所謂的中斷線程的操作,所以實(shí)際上,線程復(fù)位可以用來實(shí)現(xiàn)多個(gè)線程之間的通信脆丁。

線程的停止方法之2

除了通過interrupt 標(biāo)識(shí)為去中斷線程以外世舰,我們還可以通過下面這種方式,定義一個(gè)volatile 修飾的成員變量槽卫,來控制線程的終止。這實(shí)際上是應(yīng)用了volatile 能夠?qū)崿F(xiàn)多線程之間共享變量的可見性這一特點(diǎn)來實(shí)現(xiàn)的胰蝠。

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末歼培,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子茸塞,更是在濱河造成了極大的恐慌躲庄,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钾虐,死亡現(xiàn)場離奇詭異噪窘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)效扫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門倔监,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人菌仁,你說我怎么就攤上這事浩习。” “怎么了济丘?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵谱秽,是天一觀的道長。 經(jīng)常有香客問我摹迷,道長疟赊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任峡碉,我火速辦了婚禮近哟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘异赫。我一直安慰自己椅挣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布塔拳。 她就那樣靜靜地躺著鼠证,像睡著了一般。 火紅的嫁衣襯著肌膚如雪靠抑。 梳的紋絲不亂的頭發(fā)上量九,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼荠列。 笑死类浪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肌似。 我是一名探鬼主播费就,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼川队!你這毒婦竟也來了力细?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤固额,失蹤者是張志新(化名)和其女友劉穎眠蚂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斗躏,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逝慧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啄糙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片笛臣。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖迈套,靈堂內(nèi)的尸體忽然破棺而出捐祠,到底是詐尸還是另有隱情,我是刑警寧澤桑李,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布踱蛀,位于F島的核電站,受9級特大地震影響贵白,放射性物質(zhì)發(fā)生泄漏率拒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一禁荒、第九天 我趴在偏房一處隱蔽的房頂上張望猬膨。 院中可真熱鬧,春花似錦呛伴、人聲如沸勃痴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沛申。三九已至,卻和暖如春姐军,著一層夾襖步出監(jiān)牢的瞬間铁材,已是汗流浹背尖淘。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留著觉,地道東北人村生。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像饼丘,于是被迫代替她去往敵國和親趁桃。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

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