如果线程没有被阻塞,Thread.interrupt()会做什么?

时间:2014-05-23 20:25:43

标签: java android multithreading concurrency

Thread的JavaDoc表示Thread.interrupt()中断了一个线程如下:

  
      
  • 在对象的wait()方法或其中一个方法中被阻止的主题   join()sleep()方法将被唤醒,其中断状态   将被清除,他们会收到InterruptedException
  •   
  • InterruptibleChannel的I / O操作中被阻塞的线程将设置其中断状态并接收ClosedByInterruptException。此外,该频道将被关闭。
  •   
  • Selector中阻止的线程将设置其中断状态并立即返回。在这种情况下,他们不会收到例外。
  •   

如果该主题不符合上述任何条件,该怎么办?它被杀了还是继续运行或是什么?

提前致谢...

2 个答案:

答案 0 :(得分:4)

如果被中断的线程没有检查Thread.isInterrupted()并对其做了一些事情,那么在未阻塞的线程上调用Thread.interrupt()除了简单地设置标志之外什么都没有。线程实现者的工作是用Thread.isInterrupted()正确检查线程的状态并采取适当的措施。

答案 1 :(得分:0)

从JLS中读取的一些内容

  

17.2.3。中断

     

在调用Thread.interrupt时发生中断操作,如   以及定义为依次调用它的方法,例如   ThreadGroup.interrupt。

     

让t是调用u.interrupt的线程,对于某些线程u,其中t   你可能是一样的。此操作会导致您的中断状态   设置为true。

     

此外,如果存在一些其等待集包含u的对象m,   然后你被从m的等待集中移除。这使你能够恢复   等待动作,在这种情况下,等待将重新锁定m   监视器,抛出InterruptedException。

     

Thread.isInterrupted的调用可以确定一个线程   中断状态。静态方法Thread.interrupted可能是   由线程调用以观察并清除其自身的中断状态。

来自Thread.interrupt() Javadoc

  

public void interrupt()

     

中断此主题。除非目前   线程正在打断自己,这总是被允许的   调用此线程的checkAccess方法,这可能会导致   抛出SecurityException。

     

如果在调用wait()时阻塞了这个线程,请等待(long),   或者等待(long,int)Object类或join()的方法,   join(long),join(long,int),sleep(long)或sleep(long,int)方法   这个类,然后它的中断状态将被清除   收到InterruptedException。

     

如果此线程在可中断的I / O操作中被阻止   然后通道将关闭,线程的中断状态   将被设置,线程将收到ClosedByInterruptException。

     

如果在选择器中阻塞了该线程,则线程中断   状态将被设置,它将立即从选择中返回   操作,可能具有非零值,就像选择器一样   唤醒唤醒方法。

     

如果以前的条件都没有,则该线程会中断   状态将被设置。

     

中断非活动的线程无需任何效果。

要点:

如果某个线程位于waitsleepjoin或其他使其处于等待状态的状态,则只会抛出InterruptedException来通知某个线程他希望他能够阻止他正在做的事情和死亡。

如果它不是之前的状态,它只会设置一个标志(称为中断状态)。你可以理解它会做 nothing 以避免由早期中断的线程引起的一些错误,这可能导致你的对象处于不一致的状态(你无法知道它在做什么)。 / p>

线程使用此标志来确定是否有人要求他停止工作,由程序员决定是否停止线程(您可以自由忽略它。)

重要waitsleep等方法(如上所述)将在抛出异常时清除该标志。如果您执行while(!Thread.isInterrupted())之类的操作来记住这一点,这一点非常重要。

如果需要,您可以使用isInterruptedinterrupted

了解当前的举报状态

两者之间的唯一区别interrupted重置标记,而isInterrupted则没有。

另一个很棒的读物,here

(p.s我希望链接正确的JLS部分,我会搜索更多。)