Java多線程學(xué)習(xí)之Interrupt中斷

引言

本文將由以下幾點(diǎn)來(lái)說(shuō)明Interrupt中斷:
1.什么是中斷姜钳?為什么使用中斷伯襟?
2.中斷的作用
3.中斷的使用

1.什么是中斷Interrupt?

??一般來(lái)說(shuō),當(dāng)線程在執(zhí)行完run方法的最后一句話或者在執(zhí)行過(guò)程中出現(xiàn)沒(méi)有捕獲的異常的話摇零,這個(gè)線程就被終止了锋恬。這兩種線程終止方式都是非人為控制的終止,如果開(kāi)發(fā)人員希望可以人為可控地手動(dòng)終止一個(gè)線程來(lái)取消該線程中進(jìn)行IO下載杠娱、取消上傳等操作挽牢,該如何解決呢?

中斷與stop方法

??在Java早期版本中摊求,有一個(gè)stop方法禽拔,其他線程可以調(diào)用該方法終止某一個(gè)線程,但已經(jīng)被棄用了,原因是stop方法會(huì)終止所有未結(jié)束的方法奏赘,包括run方法寥闪,當(dāng)線程被終止時(shí),立即釋放被它鎖住的所有對(duì)象的鎖磨淌。這會(huì)導(dǎo)致線程不安全疲憋。舉個(gè)栗子:假設(shè)線程A在從一個(gè)賬戶向另一個(gè)賬戶轉(zhuǎn)賬的過(guò)程中被終止,錢(qián)已經(jīng)打出去了梁只,但是另一個(gè)賬戶卻還沒(méi)來(lái)得及接收錢(qián)缚柳。而開(kāi)發(fā)者是無(wú)法知道什么時(shí)候調(diào)用stop方法是安全的,因此該方法被棄用搪锣。
??中斷與stop不同秋忙,interrupt中斷其實(shí)是每個(gè)線程的一個(gè)boolean狀態(tài),該狀態(tài)本身并不能發(fā)揮任何作用构舟,需要開(kāi)發(fā)人員進(jìn)行處理灰追。簡(jiǎn)單來(lái)說(shuō),我們?cè)谀骋粋€(gè)線程中使用中斷方法來(lái)將目標(biāo)線程設(shè)置為中斷狀態(tài)(Thread.currentThread().intertupe())狗超,并不會(huì)終止該目標(biāo)線程弹澎,只是告訴該線程有人需要你終止,如果在該線程中沒(méi)有進(jìn)行檢測(cè)中斷狀態(tài)來(lái)自行處理努咐,那么設(shè)置該線程的中斷狀態(tài)是沒(méi)有任何作用的苦蒿!

2.中斷的作用

??中斷的第一個(gè)作用已經(jīng)呼之欲出了,作用一:讓線程可以結(jié)合業(yè)務(wù)場(chǎng)景靈活地處理自身的中斷狀態(tài)渗稍,如可控地終止線程佩迟!下面看看如何使用中斷來(lái)終止一個(gè)線程:

 public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(new InterruptedRunnable());
        thread.start();
        Thread.sleep(1000);
        thread.interrupt();
    }

    static class InterruptedRunnable implements  Runnable{
        @Override
        public void run() {
            while (true){
                System.out.println("thread is ruuning!");
                if (Thread.currentThread().isInterrupted()){
                    //如果被設(shè)置為中斷了
                    System.out.println("我被中斷了!");
                    break;
                }
            }
        }
    }

??在thread線程中循環(huán)執(zhí)行打印thread is runnning!竿屹,并檢測(cè)自身中斷狀態(tài)报强,如果被其他線程中斷了就退出循環(huán),終止線程拱燃,主線程一秒后置位該線程中斷狀態(tài)(即設(shè)置為1/true)秉溉,該線程成功終止!
作用二:中斷線程的等待
??當(dāng)線程進(jìn)入等待狀態(tài)時(shí)(即TIMED_WAITING扼雏,WAITING狀態(tài):通過(guò)調(diào)用Thread#join()方法或者Object#wait()方法(不設(shè)置超時(shí)時(shí)間坚嗜,with no timeout)或者LockSupport#park()方法可以讓一個(gè)線程從RUNNABLE狀態(tài)轉(zhuǎn)為WAITING狀態(tài)夯膀;TIMED_WAITING指線程處于等待中诗充,但是這個(gè)等待是有期限的()诱建,通過(guò)調(diào)用Thread#sleep(),Object#wait(long timeout)殉农,Thread#join(long timeout),進(jìn)入TIMED_WAITING狀態(tài))上調(diào)用interrupt方法來(lái)置位中斷狀態(tài)時(shí)引颈,阻塞調(diào)用將會(huì)被Interrupted Exception異常中斷凯肋,清除該線程的阻塞狀態(tài)!從另一個(gè)角度來(lái)說(shuō)侮东,當(dāng)某一個(gè)方法提示你有需要捕獲Interrupted Exception時(shí)就暗示該方法是可以被另一個(gè)線程通過(guò)interrupt方法中斷清除當(dāng)前狀態(tài)的,如:BlockingQueue#put豹芯、BlockingQueue#take、Object#wait铁蹈、Thread#sleep等。

Interrupted Exception異常的處理

一般有以下兩個(gè)通用原則:
?1.如果遇到的是可中斷的阻塞方法拋出InterruptedException握牧,可以繼續(xù)向方法調(diào)用棧的上層拋出該異常,如果是檢測(cè)到中斷我碟,則可清除中斷狀態(tài)并拋出InterruptedException,使當(dāng)前方法也成為一個(gè)可中斷的方法矫俺。
?2.若有時(shí)候不太方便在方法上拋出InterruptedException,比如要實(shí)現(xiàn)的某個(gè)接口中的方法簽名上沒(méi)有throws InterruptedException厘托,這時(shí)就可以捕獲可中斷方法的InterruptedException并通過(guò)Thread.currentThread.interrupt()來(lái)重新設(shè)置中斷狀態(tài)友雳。如果是檢測(cè)并清除了中斷狀態(tài),亦是如此

3.中斷的使用

java.lang.Thread類(lèi)提供了幾個(gè)方法來(lái)操作這個(gè)中斷狀態(tài)铅匹,這些方法包括:
1.public static boolean interrupted
?測(cè)試當(dāng)前線程是否已經(jīng)中斷押赊。線程的中斷狀態(tài) 由該方法清除。換句話說(shuō)包斑,如果連續(xù)兩次調(diào)用該方法流礁,則第二次調(diào)用將返回 false(在第一次調(diào)用已清除了其中斷狀態(tài)之后,且第二次調(diào)用檢驗(yàn)完中斷狀態(tài)前罗丰,當(dāng)前線程再次中斷的情況除外)神帅。
2.public boolean isInterrupted()
?測(cè)試線程是否已經(jīng)中斷。線程的中斷狀態(tài)不受該方法的影響萌抵。
3.public void interrupt()
?中斷線程

中斷的幾個(gè)使用場(chǎng)景

1.點(diǎn)擊某個(gè)桌面應(yīng)用中的取消按鈕時(shí)找御;
2.某個(gè)操作超過(guò)了一定的執(zhí)行時(shí)間限制需要中止時(shí)元镀;
3.多個(gè)線程做相同的事情,只要一個(gè)線程成功其它線程都可以取消時(shí)霎桅;
4.一組線程中的一個(gè)或多個(gè)出現(xiàn)錯(cuò)誤導(dǎo)致整組都無(wú)法繼續(xù)時(shí)栖疑;
5.當(dāng)一個(gè)應(yīng)用或服務(wù)需要停止時(shí)。

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末滔驶,一起剝皮案震驚了整個(gè)濱河市遇革,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌揭糕,老刑警劉巖澳淑,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異插佛,居然都是意外死亡杠巡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)雇寇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)氢拥,“玉大人,你說(shuō)我怎么就攤上這事锨侯∧酆#” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵囚痴,是天一觀的道長(zhǎng)叁怪。 經(jīng)常有香客問(wèn)我,道長(zhǎng)深滚,這世上最難降的妖魔是什么奕谭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮痴荐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘难捌。我一直安慰自己鸦难,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布击敌。 她就那樣靜靜地躺著愚争,像睡著了一般挤聘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鞍陨,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天诚撵,我揣著相機(jī)與錄音键闺,去河邊找鬼。 笑死辛燥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的徘六。 我是一名探鬼主播榴都,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼嘴高,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了谍失?” 一聲冷哼從身側(cè)響起莹汤,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤纲岭,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后窃判,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體喇闸,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年宛琅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逗旁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡红伦,死狀恐怖昙读,靈堂內(nèi)的尸體忽然破棺而出膨桥,到底是詐尸還是另有隱情,我是刑警寧澤国撵,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布介牙,位于F島的核電站,受9級(jí)特大地震影響囚似,放射性物質(zhì)發(fā)生泄漏线得。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一募狂、第九天 我趴在偏房一處隱蔽的房頂上張望祸穷。 院中可真熱鬧,春花似錦雷滚、人聲如沸吗坚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至躬充,卻和暖如春充甚,著一層夾襖步出監(jiān)牢的瞬間霸褒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工技矮, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衰倦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓樊零,卻偏偏與公主長(zhǎng)得像驻襟,于是被迫代替她去往敵國(guó)和親芋哭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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