中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中多線程的中斷機制有哪些

發布時間:2021-04-08 16:09:11 來源:億速云 閱讀:145 作者:Leah 欄目:編程語言

本篇文章為大家展示了Java中多線程的中斷機制有哪些,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

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中多線程的中斷機制有哪些,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

罗田县| 嘉兴市| 金塔县| 郧西县| 腾冲县| 渭南市| 社会| 镇原县| 灌阳县| 新和县| 阳朔县| 东乌珠穆沁旗| 隆安县| 昌图县| 淮滨县| 桃园市| 巨鹿县| 新泰市| 县级市| 汤阴县| 布拖县| 西藏| 海兴县| 海丰县| 陇川县| 昌黎县| 镇江市| 嘉荫县| 盘山县| 米泉市| 仪陇县| 胶南市| 内黄县| 固安县| 巫山县| 新建县| 瓦房店市| 广丰县| 临汾市| 重庆市| 穆棱市|