2015-12-17 93 views
1

我的假設是,LockSupport.parkNanos(long)不會拋出InterruptedException,但標誌可以線程上設置。調用LockSupport.parkNanos(long)後是否需要檢查線程中斷狀態?

  1. 這是正確的嗎?
  2. 如果是這樣,我需要檢查標誌,並拋出InterruptedException

使用範例:

import java.util.concurrent.locks.LockSupport; 

public void parkNanosInterruptibly(final long nanos) 
throws InterruptedException { 
    LockSupport.parkNanos(nanos); 
    // If this thread was interrupted during parkNanos(), we must throw "by contract". 
    if (Thread.interrupted()) { 
     throw new InterruptedException(); 
    } 
} 

回答

2

是的,它會不會拋出InterruptedException。 JavaDoc的

公共靜態無效parkNanos(長毫微秒)

爲了線程調度禁用當前線程,最多到指定 等待時間,除非許可可用。如果許可證是 可用,那麼它被消耗並且呼叫立即返回; 否則當前線程用於線程調度禁用 目的,一直處於休眠狀態的四兩件事之一碰巧:

  • 其他某些線程調用取消擱置與當前線程作爲 目標;

  • 或其他某個線程中斷當前線程;

  • 或該指定的等待時間;
  • 或呼叫不合邏輯地(即,沒有任何理由)返回。

此方法不會報告哪些導致 返回的方法。主叫方應重新檢查首先導致線路停車的條件。例如,呼叫者也可以確定線程的中斷狀態,或者返回時經過的時間。

參數:毫微 - 納秒的最大數目等待

是的,這是不正確的忽略中斷的事實。所以你必須檢查中斷並以某種方式處理它(例如關閉一些資源並拋出異常或關閉線程或其他)。

有一篇來自Java Language Architects Brian Goetz的好文章,http://www.ibm.com/developerworks/library/j-jtp05236/

相關問題