最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多線程中斷機(jī)制三種方法及示例

 更新時間:2017年11月14日 16:41:56   作者:五月的倉頡  
這篇文章主要介紹了Java多線程中斷機(jī)制三種方法及示例,向大家分享了這三種方法的介紹幾代碼示例,具有一定參考價值,需要的朋友可以了解下。

概述

之前講解Thread類中方法的時候,interrupt()、interrupted()、isInterrupted()三個方法沒有講得很清楚,只是提了一下。現(xiàn)在把這三個方法同一放到這里來講,因?yàn)檫@三個方法都涉及到多線程的一個知識點(diǎn)----中斷機(jī)制。

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

中斷機(jī)制也是一樣的,每個線程對象里都有一個標(biāo)識位表示是否有中斷請求(當(dāng)然JDK的源碼是看不到這個標(biāo)識位的,是虛擬機(jī)線程實(shí)現(xiàn)層面的),代表著是否有中斷請求。

三個中斷方法

上面說了,中斷標(biāo)識位是JDK源碼看不到的,是虛擬機(jī)線程實(shí)現(xiàn)層面的。下面結(jié)合代碼逐一看一下這三個方法的作用,以及為什么中斷標(biāo)識位是虛擬機(jī)實(shí)現(xiàn)層面的:

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();
  }

結(jié)果

 /* 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",即方法的作用僅僅是設(shè)置中斷標(biāo)識位

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

2、isInterrupted()

方法唯一的作用只是測試線程是否已經(jīng)中斷,中斷標(biāo)識位的狀態(tài)并不受到該方法的影響,看一下Java是如何實(shí)現(xiàn)這個方法的:

/**
 * 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",即線程的中斷狀態(tài)不受到這個方法的影響。最終調(diào)用的是isInterrupted(boolean ClearInterrupted),這個方法是一個native的,看得出也是Java虛擬機(jī)實(shí)現(xiàn)的。方法的參數(shù)ClearInterrupted,顧名思義,清除中斷標(biāo)識位,這里傳遞false,明顯就是不清除

3、interrupted()

方法的作用是測試當(dāng)前線程是否已經(jīng)中斷,線程的中斷標(biāo)識位由該方法清除。換句話說,連續(xù)兩次調(diào)用該方法的返回值必定是false??匆幌逻@個方法是如何實(shí)現(xiàn)的:

/**
 * 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行的注釋已經(jīng)寫得很清楚了,"Theinterruptedstatusofthethreadisclearedbythismethod",即線程的中斷狀態(tài)由此方法清除。另外,interrupted()方法和isInterrupted()方法調(diào)用的是同一個native方法,無非這個方法傳入的是true,表示清除中斷標(biāo)識位

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

中斷處理時機(jī)

這其實(shí)是一個很寬泛的、沒有標(biāo)注答案的話題。顯然,作為一種協(xié)作機(jī)制,不會強(qiáng)求被中斷的線程一定要在某個點(diǎn)進(jìn)行中斷處理。實(shí)際上,被中斷線程只需要在合適的時候處理即可,如果沒有合適的時間點(diǎn),甚至可以不處理。"合適的時間點(diǎn)"就和業(yè)務(wù)邏輯密切相關(guān)了。

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

線程中斷舉例

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

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("線程中斷了,程序到這里了");
}

看一下運(yùn)行結(jié)果:

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

代碼分為以下幾步:

1、main函數(shù)起一個t線程

2、main函數(shù)3秒鐘之后給t線程打一個中斷標(biāo)識位,表示t線程要中斷

3、t線程無限輪詢自己的中斷標(biāo)識位,中斷了則打印、退出,否則一直運(yùn)行

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

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

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

總結(jié)

以上就是本文關(guān)于Java多線程中斷機(jī)制三種方法及示例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:

Java多線程定時器Timer原理及實(shí)現(xiàn)

Java多線程編程實(shí)現(xiàn)socket通信示例代碼

Java利用future及時獲取多線程運(yùn)行結(jié)果

如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • Java字符串相關(guān)類StringBuffer的用法詳解

    Java字符串相關(guān)類StringBuffer的用法詳解

    java.lang包下的StringBuffer類,代表著可變的字符序列,可以用來對字符串內(nèi)容進(jìn)行增刪改操作。本文將通過示例詳細(xì)說說它的用法,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-10-10
  • SpringBoot使用AOP實(shí)現(xiàn)防重復(fù)提交功能

    SpringBoot使用AOP實(shí)現(xiàn)防重復(fù)提交功能

    這篇文章主要為大家詳細(xì)介紹了SpringBoot如何使用AOP實(shí)現(xiàn)防重復(fù)提交功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • springboot+vue實(shí)現(xiàn)七牛云頭像的上傳

    springboot+vue實(shí)現(xiàn)七牛云頭像的上傳

    本文將介紹如何在Spring Boot項(xiàng)目中利用七牛云進(jìn)行圖片上傳并將圖片存儲在云存儲中,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • 兩天沒解決的問題chatgpt用了5秒搞定隱藏bug

    兩天沒解決的問題chatgpt用了5秒搞定隱藏bug

    這篇文章主要為大家描述了我用了兩天沒解決的問題chatgpt用了5秒搞定的全程介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Java19新特性中外部函數(shù)與內(nèi)存API

    Java19新特性中外部函數(shù)與內(nèi)存API

    Java19引入的外部函數(shù)與內(nèi)存API(預(yù)覽功能)是Project Panama一部分,旨在簡化Java與本地代碼及非堆內(nèi)存的交互,提供更低層次的編程能力,解決了傳統(tǒng)JNI調(diào)用的復(fù)雜性、安全性和性能局限,特別適合高性能計算和系統(tǒng)編程領(lǐng)域,感興趣的可以了解一下
    2024-09-09
  • Spring?Boot?如何正確讀取配置文件屬性

    Spring?Boot?如何正確讀取配置文件屬性

    這篇文章主要介紹了Spring?Boot?如何正確讀取配置文件屬性,項(xiàng)目中經(jīng)常會經(jīng)常讀取配置文件中的屬性的值,Spring?Boot提供了很多注解讀取配置文件屬性,那么如何正確使用呢,下文一起來參考下面文章內(nèi)容吧
    2022-04-04
  • Java swing仿酷狗音樂播放器

    Java swing仿酷狗音樂播放器

    這篇文章主要為大家詳細(xì)介紹了Java swing實(shí)現(xiàn)音樂播放器,Java開發(fā)圖形界面程序音樂播放器仿酷狗音樂播放器,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java實(shí)現(xiàn)解析JSON大文件JsonReader工具詳解

    Java實(shí)現(xiàn)解析JSON大文件JsonReader工具詳解

    這篇文章主要介紹了Java實(shí)現(xiàn)解析JSON大文件的工具JsonReader使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-01-01
  • SpringBoot自動裝配Import示例詳解

    SpringBoot自動裝配Import示例詳解

    SpringBoot中@Import注解的使用可以幫助開發(fā)者將指定的Bean或配置類導(dǎo)入到IOC容器中,該注解支持四種用法:導(dǎo)入Bean、導(dǎo)入配置類、實(shí)現(xiàn)ImportSelector接口和實(shí)現(xiàn),感興趣的朋友一起看看吧
    2024-09-09
  • swagger文檔增強(qiáng)工具knife4j使用圖文詳解

    swagger文檔增強(qiáng)工具knife4j使用圖文詳解

    這篇文章主要介紹了swagger文檔增強(qiáng)工具knife4j使用詳解,想要使用knife4j非常簡單,只要在Springboot項(xiàng)目中引入knife4j的依賴即可,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08

最新評論

肇庆市| 镇远县| 逊克县| 宝坻区| 洮南市| 商丘市| 富顺县| 江门市| 大冶市| 清远市| 通江县| 连州市| 于都县| 广东省| 大同市| 东城区| 崇仁县| 上虞市| 徐州市| 三河市| 仁布县| 沈丘县| 吉林省| 黄平县| 夏邑县| 东丰县| 开江县| 双鸭山市| 香港 | 盐津县| 大邑县| 义乌市| 台南县| 特克斯县| 唐山市| 武冈市| 绥化市| 崇阳县| 静海县| 上高县| 嘉峪关市|