2013-04-09 83 views
4

我是新来的Java世界,如果它是愚蠢的问题,请耐心等待。什么是检查InterruptedException的好习惯?

我最近在Runnable对象的run()方法中看到了类似这样的代码。

try { 
    if (Thread.interrupted()) { 
     throw new InterruptedException(); 
    } 

    // do something 

    if (Thread.interrupted()) { 
     throw new InterruptedException(); 
    } 

    // do something 

    if (Thread.interrupted()) { 
     throw new InterruptedException(); 
    } 

    // and so on 

} catch (InterruptedException e){ 
    // Handle exception 
} finally { 
    // release resource 
} 

多久检查一次线程中断,应该在哪里检查线程中断?

回答

5

它通常不是你只是洒在你的代码中的东西。但是,如果您期望能够取消异步任务,则可能需要定期检查中断。换句话说,当您识别需要更加响应中断的代码体时,通常会在之后添加

+0

谢谢,用户可以点击一个键,或点击鼠标中断点数?我只是想到其他情况:我们可以在长时间执行之前放置它,所以如果在线程进入该部分之前发生中断,我们可以终止线程而不浪费我们的cpu或内存来做一些不再有效的事情。 – jAckOdE 2013-04-09 05:00:19

+0

@jAckOdE - 当某些代码调用'thread.interrupt()'时,会发生中断。 – jtahlborn 2013-04-09 12:11:31

3

我通常没有看到正在使用的线程中断机制 - 同样,如果你的代码没有中断线程,那么线程不需要检查它们是否被中断。然而,如果你的程序正在使用的线程中断机制,那么的好地方放,如果(Thread.interrupted())检查是在你的Runnable顶层循环:一个Runnable往往会看起来像

run() { 
    while(true) { 
     ... 
    } 
} 

此致反而会看起来像

run() { 
    try { 
     while(true) { 
      if(Thread.interrupted()) { 
       throw new InterruptedException(); 
      } 
      ... 
     } 
    } catch (InterruptedException ex) { 
     ... 
    } 
} 
+0

谢谢,对于包含无限循环的run()方法,我认为这可能是标准模式。 – jAckOdE 2013-04-09 04:54:50

2

当有人调用其interrupt()方法的线程才会被中断。如果您从未拨打电子邮件interrupt(),并且您没有与调用interrupt()的图书馆合作(并且您希望这些内容会被拼写出来),那么您无需检查中断。

有人想要想要中断一个线程的主要原因是取消阻塞或长时间运行的任务。例如,锁定机制wait()通常会导致线程永久等待通知,但另一个线程可能会中断以强制等待线程停止等待(通常这将取消操作)。