亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java多線程中斷機制三種方法及示例

2024-07-13 10:14:04
字體:
來源:轉載
供稿:網友

概述

之前講解Thread類中方法的時候,interrupt()、interrupted()、isInterrupted()三個方法沒有講得很清楚,只是提了一下。現在把這三個方法同一放到這里來講,因為這三個方法都涉及到javascript/24923.html">javascript/109607.html">java/210561.html">多線程的一個知識點----中斷機制。

Java沒有提供一種安全、直接的方法來停止某個線程,而是提供了中斷機制。中斷機制是一種協作機制,也就是說通過中斷并不能直接終止另一個線程,而需要被中斷的線程自己處理。有個例子舉個蠻好,就像父母叮囑出門在外的子女要注意身體一樣,父母說了,但是子女是否注意身體、如何注意身體,還是要看自己。

中斷機制也是一樣的,每個線程對象里都有一個標識位表示是否有中斷請求(當然JDK的源碼是看不到這個標識位的,是虛擬機線程實現層面的),代表著是否有中斷請求。

三個中斷方法

上面說了,中斷標識位是JDK源碼看不到的,是虛擬機線程實現層面的。下面結合代碼逐一看一下這三個方法的作用,以及為什么中斷標識位是虛擬機實現層面的:

1、interrupt()

public void interrupt() {  if (this != Thread.currentThread())    checkAccess();  synchronized (blockerLock) {    Interruptible b = blocker;    if (b != null) {    interrupt0();    // Just to set the interrupt flag    b.interrupt();    return;    }  }  interrupt0();  }

結果

 /* Some private helper methods */ private native void setPriority0(int newPriority); private native void stop0(Object o); private native void suspend0(); private native void resume0(); private native void interrupt0();

分兩部分看:

(1)第一部分的第8行注釋說得很清楚了,interrupt0()方法的作用是"Just to set the interrupt flag",即方法的作用僅僅是設置中斷標識位

(2)第二部分的第6行就是interrupt0()方法的原型,由于方法是被native修飾的,很明顯這是一個本地方法,是Java虛擬機實現的

2、isInterrupted()

方法唯一的作用只是測試線程是否已經中斷,中斷標識位的狀態并不受到該方法的影響,看一下Java是如何實現這個方法的:

/** * Tests whether this thread has been interrupted. The <i>interrupted * status</i> of the thread is unaffected by this method. * * <p>A thread interruption ignored because a thread was not alive  * at the time of the interrupt will be reflected by this method  * returning false. * * @return <code>true</code> if this thread has been interrupted; *     <code>false</code> otherwise. * @see   #interrupted() * @revised 6.0 */public boolean isInterrupted() {return isInterrupted(false);}
private native boolean isInterrupted(boolean ClearInterrupted);

注意一下第一部分的第2行和第3行,"The interrupted statis of the thread is unaffected by this method",即線程的中斷狀態不受到這個方法的影響。最終調用的是isInterrupted(boolean ClearInterrupted),這個方法是一個native的,看得出也是Java虛擬機實現的。方法的參數ClearInterrupted,顧名思義,清除中斷標識位,這里傳遞false,明顯就是不清除

3、interrupted()

方法的作用是測試當前線程是否已經中斷,線程的中斷標識位由該方法清除。換句話說,連續兩次調用該方法的返回值必定是false??匆幌逻@個方法是如何實現的:

/** * Tests whether the current thread has been interrupted. The * <i>interrupted status</i> of the thread is cleared by this method. In * other words, if this method were to be called twice in succession, the * second call would return false (unless the current thread were * interrupted again, after the first call had cleared its interrupted * status and before the second call had examined it). * * <p>A thread interruption ignored because a thread was not alive  * at the time of the interrupt will be reflected by this method  * returning false. * * @return <code>true</code> if the current thread has been interrupted; *     <code>false</code> otherwise. * @see #isInterrupted() * @revised 6.0 */public static boolean interrupted() {return currentThread().isInterrupted(true);
private native boolean isInterrupted(boolean ClearInterrupted);

同樣,第2行和第3行的注釋已經寫得很清楚了,"Theinterruptedstatusofthethreadisclearedbythismethod",即線程的中斷狀態由此方法清除。另外,interrupted()方法和isInterrupted()方法調用的是同一個native方法,無非這個方法傳入的是true,表示清除中斷標識位

此外,JDKAPI中有些類的方法也可能會調用中斷,比如FutureTask的cancel,如果傳入true則會在正在運行的異步任務上調用interrupt()方法,又如ThreadPoolExecutor中的shutdownNow方法會遍歷線程池中的工作線程并調用線程的interrupt()方法。這些場景下只要代碼沒有對中斷作出響應,那么任務將一直執行下去。

中斷處理時機

這其實是一個很寬泛的、沒有標注答案的話題。顯然,作為一種協作機制,不會強求被中斷的線程一定要在某個點進行中斷處理。實際上,被中斷線程只需要在合適的時候處理即可,如果沒有合適的時間點,甚至可以不處理。"合適的時間點"就和業務邏輯密切相關了。

處理時機決定著程序的效率和響應的靈敏度。頻繁的檢查中斷可能會導致程序執行效率低下,較少的檢查則可能導致中斷請求得不到及時響應。在實際場景中,如果性能指標比較關鍵,可能需要建立一個測試模型來分析最佳的中斷檢測點,以平衡性能和響應靈敏性。

線程中斷舉例

寫了這么多理論,寫一個例子來演示一下中斷:

public static void main(String[] args) throws Exception{  Runnable runnable = new Runnable()  {    public void run()    {      while (true)      {        if (Thread.currentThread().isInterrupted())        {          System.out.println("線程被中斷了");          return ;        }        else        {          System.out.println("線程沒有被中斷");        }      }    }  };  Thread t = new Thread(runnable);  t.start();  Thread.sleep(3000);  t.interrupt();  System.out.println("線程中斷了,程序到這里了");}

看一下運行結果:

...線程沒有被中斷線程沒有被中斷線程沒有被中斷線程沒有被中斷線程沒有被中斷線程中斷了,程序到這里了線程被中斷了

代碼分為以下幾步:

1、main函數起一個t線程

2、main函數3秒鐘之后給t線程打一個中斷標識位,表示t線程要中斷

3、t線程無限輪詢自己的中斷標識位,中斷了則打印、退出,否則一直運行

從控制臺上打印的語句看到,3秒鐘中斷后,打印出該打印的語句后,就停止了。那這種場景就是前面說的"頻繁地檢查",導致程序效率低下;那如果不頻繁地檢查呢,比如在while中的else分支中加上Thread.sleep(500),表示500ms即0.5s檢查一次,那這種場景就是前面說的"中斷得不到及時的響應"。

其實這個例子中,t線程完全可以不用去管這個中斷標識位的,不去檢查就好了,只管做自己的事情,這說明中斷標識位設不設置是別人的事情,處不處理是我自己的事情,沒有強制要求必須處理中斷。

但是,那些會拋出InterruptedException的方法要除外。像sleep、wait、notify、join,這些方法遇到中斷必須有對應的措施,可以直接在catch塊中處理,也可以拋給上一層。這些方法之所以會拋出InterruptedException就是由于Java虛擬機在實現這些方法的時候,本身就有某種機制在判斷中斷標識位,如果中斷了,就拋出一個InterruptedException。

總結

以上就是本文關于Java多線程中斷機制三種方法及示例的全部內容,希望對大家有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲香蕉伊综合在人在线视看| 亚洲国产精品va在看黑人| 亚洲人免费视频| 成人动漫网站在线观看| 国产精品成久久久久三级| 亚洲激情在线观看视频免费| 亚洲欧美激情另类校园| 亚洲黄色成人网| 一区二区三区四区在线观看视频| 国产又爽又黄的激情精品视频| 成人福利视频在线观看| 亚洲精品在线看| 亚洲高清色综合| 亚洲人成电影在线观看天堂色| 欧美精品18videos性欧美| 国产精品国语对白| 亚洲国产欧美一区二区丝袜黑人| 欧美一级高清免费| 一本一道久久a久久精品逆3p| 欧美做爰性生交视频| 亚洲精品欧美极品| 欧美精品在线观看| 日韩精品中文字幕有码专区| 久久久亚洲成人| 91精品国产自产在线| 亚洲欧美国产精品专区久久| 成人国产亚洲精品a区天堂华泰| 欧美激情一区二区久久久| 日日摸夜夜添一区| 欧美性xxxxxx| 国产亚洲美女精品久久久| 亚洲精品国产欧美| 中文字幕精品影院| 91网在线免费观看| 日韩激情视频在线| 中文字幕精品国产| 亚洲一区中文字幕在线观看| 国产精品视频在线观看| 97视频在线观看视频免费视频| 亚洲视频axxx| 美女啪啪无遮挡免费久久网站| 欧美日韩国产色| 久久99久久99精品免观看粉嫩| 伊人久久久久久久久久久| 亚洲欧美国产视频| 日韩av电影手机在线观看| 日韩一区二区三区在线播放| 欧美精品18videosex性欧美| 欧美大片网站在线观看| 久久久女人电视剧免费播放下载| 日本在线观看天堂男亚洲| 一本色道久久综合亚洲精品小说| 美女扒开尿口让男人操亚洲视频网站| 久久精品美女视频网站| 欧美成人一二三| 国产成人一区二区三区| 国产亚洲精品久久久优势| 国产日韩精品在线观看| 久久精品青青大伊人av| 成人黄色在线免费| 国产成人一区二| 欧美视频免费在线观看| 国语对白做受69| 亚洲香蕉成视频在线观看| 亚州国产精品久久久| 国产精品国产自产拍高清av水多| 九九九久久国产免费| 秋霞av国产精品一区| 国产亚洲视频中文字幕视频| 日韩欧美在线观看视频| 亚洲综合最新在线| 欧美成人免费网| 亚洲免费视频网站| 欧美老女人bb| 亚洲黄色av网站| 在线看日韩欧美| 亚洲国产成人精品一区二区| 欧美第一黄网免费网站| 久久久国产影院| 国产精品久久久久免费a∨| 92版电视剧仙鹤神针在线观看| 久99久在线视频| 久久久www成人免费精品张筱雨| 成人免费网站在线观看| 色偷偷偷亚洲综合网另类| 欧美自拍视频在线| 欧美成人性色生活仑片| www.日韩.com| 欧美日韩国产精品一区二区不卡中文| 久久视频在线免费观看| 丝袜美腿精品国产二区| 国产精品成人免费视频| 国产91精品高潮白浆喷水| 日本久久久久久久久久久| 色多多国产成人永久免费网站| 97在线看福利| 精品久久久久久久久久| 国模极品一区二区三区| 中文字幕精品一区二区精品| 日韩电影中文字幕在线| 欧美电影在线观看高清| 日韩毛片中文字幕| 亚洲人成人99网站| 成人免费网视频| 国产成人精品日本亚洲| 国产精品美女免费看| 久久午夜a级毛片| 91日本在线观看| 国产日韩欧美视频在线| 欧美亚洲视频一区二区| 欧美一级在线亚洲天堂| 国产视频久久久久久久| 国产精品极品尤物在线观看| 日韩女优人人人人射在线视频| 亚洲人成亚洲人成在线观看| 亚洲热线99精品视频| 久久色免费在线视频| www.欧美精品| 日韩精品久久久久| 亚洲欧美一区二区三区久久| 超碰91人人草人人干| 国产精品久久久久久久av大片| 亚洲天堂av在线免费| 国产成人一区三区| 欧美视频中文字幕在线| 亚洲成人三级在线| 国产精品国语对白| 亚洲国产美女久久久久| 日韩精品视频中文在线观看| 国产亚洲人成网站在线观看| 久久久欧美精品| 国产精品一二三在线| 色青青草原桃花久久综合| 亚洲欧美日韩一区在线| 欧美日本啪啪无遮挡网站| 日韩高清a**址| 久久综合九色九九| 国产婷婷色综合av蜜臀av| 91精品国产91久久久久| 久久激情视频久久| 亚洲欧美日韩国产中文| 欧美激情一级欧美精品| 7m精品福利视频导航| 色先锋资源久久综合5566| 91精品国产91久久久久久最新| 欧美国产高跟鞋裸体秀xxxhd| 最好看的2019的中文字幕视频| 欧美黑人xxxⅹ高潮交| 久久中文字幕在线视频| 欧美日韩xxxxx| 亚洲成人久久一区| 性欧美xxxx交| 欧美午夜视频在线观看| 国产偷亚洲偷欧美偷精品| 性欧美办公室18xxxxhd| 欧美日韩免费一区| 国产精品啪视频| 国产精品夫妻激情| 日韩在线视频免费观看高清中文| 国产中文字幕亚洲| 国产精品视频久久久久| 亚洲美女中文字幕| 亚洲xxxxx性| 亚洲综合国产精品|