摘要:結(jié)論先行將調(diào)用該方法的對(duì)象所表示的線程標(biāo)記一個(gè)停止標(biāo)記,并不是真的停止該線程。獲取當(dāng)前線程的中斷狀態(tài),并且會(huì)清除線程的狀態(tài)標(biāo)記。因?yàn)閳?zhí)行后它會(huì)將狀態(tài)標(biāo)志清除,底層調(diào)用了,此處參數(shù)為。
1. 結(jié)論先行
interrupt():將調(diào)用該方法的對(duì)象所表示的線程標(biāo)記一個(gè)停止標(biāo)記,并不是真的停止該線程。interrupted():獲取當(dāng)前線程的中斷狀態(tài),并且會(huì)清除線程的狀態(tài)標(biāo)記。是一個(gè)是靜態(tài)方法。
isInterrupted():獲取調(diào)用該方法的對(duì)象所表示的線程,不會(huì)清除線程的狀態(tài)標(biāo)記。是一個(gè)實(shí)例方法。
現(xiàn)在對(duì)各方法逐一進(jìn)行具體介紹:
2. interrupt()首先我們來(lái)使用一下 interrupt() 方法,觀察效果,代碼如下:
public class MainTest { @Test public void test() { try { MyThread01 myThread = new MyThread01(); myThread.start(); myThread.sleep(2000); myThread.interrupt(); } catch (Exception e) { System.out.println("main catch"); e.printStackTrace(); } } } public class MyThread01 extends Thread { @Override public void run() { super.run(); for (int i = 0; i < 500; i++) { System.out.println("i= " + i); } } }
輸出結(jié)果:
可以看出,子線程已經(jīng)執(zhí)行完成了。說(shuō)明 interrupt() 方法是不能讓線程停止,和我們一開(kāi)始所說(shuō)的那樣,它僅僅是在當(dāng)前線程記下一個(gè)停止標(biāo)記而已。
那么這個(gè)停止標(biāo)記我們又怎么知道呢?——此時(shí)就要介紹下面的 interrupted() 和 isInterrupted() 方法了。
3. interrupted() 和 isInterrupted()interrupted() 方法的聲明為 public static boolean interrupted()
isInterrupted() 方法的聲明為 public boolean isInterrupted()
這兩個(gè)方法很相似,下面我們用程序來(lái)看下使用效果上的區(qū)別吧
先來(lái)看下使用 interrupted() 的程序。
@Test public void test() { try { MyThread01 myThread = new MyThread01(); myThread.start(); myThread.sleep(1000); // 7行: Thread.currentThread().interrupt(); // Thread.currentThread() 這里表示 main 線程 myThread.interrupt(); // myThread.interrupted() 底層調(diào)用了 currentThread().isInterrupted(true); 作用是判斷當(dāng)前線程是否為停止?fàn)顟B(tài) System.out.println("是否中斷1 " + myThread.interrupted()); System.out.println("是否中斷2 " + myThread.interrupted()); } catch (InterruptedException e) { System.out.println("main catch"); } System.out.println("main end"); }
輸出結(jié)果:
由此可以看出,線程并未停止,同時(shí)也證明了 interrupted() 方法的解釋:測(cè)試當(dāng)前線程是否已經(jīng)中斷,這個(gè)當(dāng)前線程就是 main 線程,它從未中斷過(guò),所以打印結(jié)果都是 false。
那么如何使 main 線程產(chǎn)生中斷效果呢?將上面第 8 行代碼注釋掉,并將第 7 行代碼的注釋去掉再運(yùn)行,我們就可以得到以下輸出結(jié)果:
從結(jié)果上看,方法 interrupted() 的確判斷出了當(dāng)前線程(此例為 main 線程)是否是停止?fàn)顟B(tài)了,但為什么第二個(gè)布爾值為 false 呢?我們?cè)谧铋_(kāi)始的時(shí)候有說(shuō)過(guò)——interrupted() 測(cè)試當(dāng)前線程是否已經(jīng)是中斷狀態(tài),執(zhí)行后會(huì)將狀態(tài)標(biāo)志清除。
因?yàn)閳?zhí)行 interrupted() 后它會(huì)將狀態(tài)標(biāo)志清除,底層調(diào)用了 isInterrupted(true),此處參數(shù)為 true 。所以 interrupted() 具有清除狀態(tài)標(biāo)記功能。
在第一次調(diào)用時(shí),由于此前執(zhí)行了 Thread.currentThread().interrupt();,導(dǎo)致當(dāng)前線程被標(biāo)記了一個(gè)中斷標(biāo)記,因此第一次調(diào)用 interrupted() 時(shí)返回 true。因?yàn)?interrupted() 具有清除狀態(tài)標(biāo)記功能,所以在第二次調(diào)用 interrupted() 方法時(shí)會(huì)返回 false。
以上就是 interrupted() 的介紹內(nèi)容,最后我們?cè)賮?lái)看下 isInterrupted() 方法吧。
isInterrupted() 和 interrupted() 有兩點(diǎn)不同:一是不具有清除狀態(tài)標(biāo)記功能,因?yàn)榈讓觽魅?isInterrupted() 方法的參數(shù)為 false。二是它判斷的線程調(diào)用該方法的對(duì)象所表示的線程,本例為 MyThread01 對(duì)象。
我們修改一下上面的代碼,看下運(yùn)行效果:
@Test public void test() { try { MyThread01 myThread = new MyThread01(); myThread.start(); myThread.sleep(1000); myThread.interrupt(); // 修改了下面這兩行。 // 上面的代碼是 myThread.interrupted(); System.out.println("是否中斷1 " + myThread.isInterrupted()); System.out.println("是否中斷2 " + myThread.isInterrupted()); } catch (InterruptedException e) { System.out.println("main catch"); e.printStackTrace(); } System.out.println("main end"); }
輸出結(jié)果:
結(jié)果很明顯,因?yàn)?isInterrupted() 不具有清除狀態(tài)標(biāo)記功能,所以兩次都輸出 true。
參考文章:http://www.cnblogs.com/hapjin...
歡迎關(guān)注微信公眾號(hào)「不只Java」,后臺(tái)回復(fù)「電子書」,送說(shuō)不定有你想要的呢
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72491.html
摘要:合理中斷線程合理中斷在類中提供了和方法這三個(gè)方法分別是用來(lái)結(jié)束暫?;謴?fù)線程但是都已經(jīng)被標(biāo)記為廢棄了因?yàn)橐粋€(gè)線程不應(yīng)該由其他線程來(lái)結(jié)束他應(yīng)該收到別人的通知然后自己在合適的位置結(jié)束如果不合理的結(jié)束會(huì)導(dǎo)致很多意外的結(jié)果比如臨界區(qū)還沒(méi)完全操作完提前 合理中斷線程 合理中斷 在Thread類中,提供了stop(),suspend()和resume()方法,這三個(gè)方法分別是用來(lái)結(jié)束,暫停,恢復(fù)線程...
摘要:線程中斷線程中斷就是一種協(xié)作機(jī)制。它并不會(huì)真正的中斷一個(gè)正在運(yùn)行的線程,而只是發(fā)出中斷請(qǐng)求,然后由線程在下一個(gè)合適的時(shí)刻中斷自己。 線程池生命周期包括: RUNNING:接收新的任務(wù)并處理隊(duì)列中的任務(wù) SHUTDOWN:不接收新的任務(wù),但是處理隊(duì)列中的任務(wù) STOP:不接收新的任務(wù),不處理隊(duì)列中的任務(wù),同時(shí)中斷處理中的任務(wù) TIDYING:所有的任務(wù)處理完成,有效的線程數(shù)是0 TER...
摘要:現(xiàn)在終止一個(gè)線程,基本上只能靠曲線救國(guó)式的中斷來(lái)實(shí)現(xiàn)。中斷機(jī)制的核心在于中斷狀態(tài)和異常中斷狀態(tài)設(shè)置一個(gè)中斷狀態(tài)清除一個(gè)中斷狀態(tài)方法同時(shí)會(huì)返回線程原來(lái)的中斷的狀態(tài)。中斷異常中斷異常一般是線程被中斷后,在一些類型的方法如中拋出。 前言 系列文章目錄 線程中斷是一個(gè)很重要的概念,通常,取消一個(gè)任務(wù)的執(zhí)行,最好的,同時(shí)也是最合理的方法,就是通過(guò)中斷。 本篇我們主要還是通過(guò)源碼分析來(lái)看看中斷的概...
摘要:接口接口允許我們?cè)诰€程執(zhí)行的時(shí)候有返回值,以及拋出異常線程的停止類中的個(gè)停止方法三者區(qū)別將線程標(biāo)記為中斷返回線程當(dāng)前的中斷狀態(tài),不清除線程的中斷標(biāo)記返回線程當(dāng)前的中斷狀態(tài),并清除線程的中斷標(biāo)記與本質(zhì)都是調(diào)用了的。 1、通過(guò)繼承Thread類 public static class MThread extends Thread{ @Override public voi...
摘要:表示一個(gè)異步任務(wù)的結(jié)果,就是向線程池提交一個(gè)任務(wù)后,它會(huì)返回對(duì)應(yīng)的對(duì)象。它們分別提供兩個(gè)重要的功能阻塞當(dāng)前線程等待一段時(shí)間直到完成或者異常終止取消任務(wù)。此時(shí),線程從中返回,然后檢查當(dāng)前的狀態(tài)已經(jīng)被改變,隨后退出循環(huán)。 0 引言 前段時(shí)間需要把一個(gè)C++的項(xiàng)目port到Java中,因此時(shí)隔三年后重新熟悉了下Java。由于需要一個(gè)通用的線程池,自然而然就想到了Executors。 用了...
閱讀 3888·2021-10-08 10:05
閱讀 2973·2021-09-27 13:57
閱讀 2697·2019-08-29 11:32
閱讀 1022·2019-08-28 18:18
閱讀 1315·2019-08-28 18:05
閱讀 2000·2019-08-26 13:39
閱讀 878·2019-08-26 11:37
閱讀 2060·2019-08-26 10:37