3

好的,假设我有一个执行 while() 循环的线程。在循环期间,可以做一些事情然后重新进入睡眠状态:

public void run() {
    while (some_condition) {
        doSomeLongJob();      // this could be a long job
        try {
            Thread.sleep(a_bit);    // back to sleep
        } catch (InterruptedException ie) {
            handleInterruptionButDoNotExitLoop();
        }
    }
}

一些问题:

  1. 如果在doSomeLongJob的执行过程中出现一些中断,该方法将继续其自然结束吗?(我想是的,只要没有人检查Thread.interrupted()但我想要确认);
  2. 捕获中断后,interrupted()状态是否会重置为 false?
  3. 总而言之,一个线程只要重置线程状态就可以中断n次?有没有办法手动重置线程状态以处理doSomeLongJob执行期间的中断?
4

3 回答 3

1

通过调用Thread.interrupted()您可以获得标志的状态,然后将其清除。

我的建议是:如果有疑问,请调用此方法以明确(向以后必须维护代码的人)您想要吸收条件并继续。

于 2013-04-05T10:47:27.600 回答
1
  1. 也许,如果doSomeLongJob有打开InterruptibleChannel的 IO 对象,ClosedByInterruptException如果线程中断状态未清除,它们会在您下次尝试访问它们时抛出。

  2. InterruptedException被Java核心类抛出时,未设置线程中断状态

  3. Thread.interrupted将清除中断状态。如果您只需要测试中断,Thread.isInterrupted将为您提供状态并保留中断状态。

于 2013-04-05T10:50:46.850 回答
1

要回答您的问题:

  1. 当您说中断时,您的意思是 InterruptedException 吗?如果是这样,我认为您应该将doSomeLongJob移到try 中以处理可能的异常。

  2. 它不会被重置为 false,您必须手动执行。

  3. 要重置中断状态,请调用 Thread.interrupted() 。

于 2013-04-05T10:53:36.540 回答