“干净”的方式来打断一个可能正在做某事的线程

时间:2013-04-05 10:40:26

标签: java multithreading interrupt

好吧,假设我有一个执行while()循环的Thread。在循环中,可以做一些事情,然后再回去睡觉:

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. 在捕获中断后,中断()状态是否会重置为false?
  3. 总之,只要线程状态被重置,线程就可以被 n 次中断?有没有办法重置手动线程状态,以便在执行 doSomeLongJob 期间处理中断?

3 个答案:

答案 0 :(得分:1)

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

我的建议是:如果有疑问,请将此方法告知(对于以后必须维护代码的人),您希望吸收该条件并继续进行。

答案 1 :(得分:1)

  1. 也许,如果doSomeLongJobInterruptibleChannel个IO对象,如果没有清除线程中断状态,下次你将尝试访问它们时会抛出ClosedByInterruptException。< / p>

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

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

答案 2 :(得分:1)

回答你的问题:

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

  2. 不会将其重置为false,您必须手动执行此操作。

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