2015-12-17 51 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/

相关问题