调用LockSupport.parkNanos(long)后是否需要检查线程中断状态?

时间:2015-12-17 08:34:55

标签: java api concurrency memory-barriers java-memory-model

我的假设是LockSupport.parkNanos(long)不会抛出InterruptedException,但可以在线程上设置标志。

  1. 这是对的吗?
  2. 如果是,我是否需要检查标志并抛出InterruptedException
  3. 样本用法:

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

1 个答案:

答案 0 :(得分:2)

是的,它不会抛出InterruptedException。 JavaDoc的

  

public static void parkNanos(long nanos)

     

禁用当前线程以进行线程调度,最多可达到指定的线程   等待时间,除非有许可证。如果许可证是   可用然后它被消耗并且呼叫立即返回;   否则当前线程将被禁用以进行线程调度   目的和谎言一直处于休眠状态,直到四件事之一发生:

     
      
  • 其他一些线程使用当前线程调用unpark   目标;

  •   
  • 或其他一些线程中断当前线程;

  •   
  • 或指定的等待时间过去;
  •   
  • 或该虚假呼叫(即无缘无故)返回。
  •   
     

此方法不会报告导致这些问题   要返回的方法。呼叫者应该重新检查哪些条件   导致线程首先停放。来电者也可以   例如,确定线程的中断状态,或者   返回时经过的时间。

     

参数:nanos - 等待的最大纳秒数

是的,忽略中断的事实是不正确的。所以你必须检查中断并以某种方式处理它(例如关闭一些资源并抛出异常或关闭线程或其他)。

Java语言架构师Brian Goetz撰写了一篇很好的文章,http://www.ibm.com/developerworks/library/j-jtp05236/