了解Thread.interrupt()的用法

时间:2013-08-07 09:48:46

标签: java multithreading interrupt

我正在阅读Oracle Docs中的Interrupts。我无法弄清楚以下内容 部分。它说明了

  

如果一个线程长时间没有调用一个方法怎么办?   抛出InterruptedException?然后它必须定期调用   Thread.interrupted,如果有中断,则返回true   接收。例如:

for (int i = 0; i < inputs.length; i++) {
    heavyCrunch(inputs[i]);
    if (Thread.interrupted()) {
        // We've been interrupted: no more crunching.
        return;
    }
}

我正在摸不着头脑,理解这是什么意思如果一个帖子花了很长时间 没有调用抛出InterruptedException的方法的时间?其次,用法是什么 Thread.interrupted(),这是一种方式,该线程可以向自己发送一个中断?什么是 这种情况的实际用法?感谢。

6 个答案:

答案 0 :(得分:4)

这是一种让线程可用于中断的技术。

Thread.interrupted() :检查当前线程(本身)是否被某个其他线程中断并清除中断状态标志。所以它问我自己是否被某个人打断了我在执行BIG BIG任务而不是听别人的时候退出我正在做的事情。

想象一下如果没有这样做会发生什么。

假设heavyCrunch()的一次迭代需要1分钟的时间。所以n次迭代需要n分钟。

现在假设在启动程序后,您决定要退出程序并正常终止程序。所以你打断了正在进行重度紧缩的线程。 但由于未检查中断状态,因此线程未知您已中断它。因此,在 N分钟尚未完成之前,该计划不会结束,您必须等待时间。

为了优雅地终止线程,它应该始终检查中断状态,以便在其他人请求中断时作出响应。

答案 1 :(得分:3)

除了短语

之外
  

如果线程长时间没有调用抛出InterruptedException的方法会怎么样?

目前尚不清楚,我认为它们意味着以下内容:

  

通常,如果你有一个在while(true)循环中做一些工作的线程,也就是一个不会长时间终止的线程,你可能会放置一个在该线程中抛出InterruptedException的ANY函数(即Thread.sleep(),套接字读取或任何东西!)。这样,当你的线程被注意到一个中断时,其中一个函数会捕获它,你将能够退出你在线程中做的事情(线程不仅仅是神奇地终止它自己)。

这句话想说的是:

  

如果您不想/必须使用这些功能?然后你应该使用Thread.interrupted()来检查你是否应该以你捕获InterruptedException时的方式执行线程正在做的事情。

我希望这比文件更清楚......

答案 2 :(得分:2)

如果中断运行此代码的线程

for (int i = 0; i < inputs.length; i++) {
    heavyCrunch(inputs[i]);
}

它只会在线程中设置中断状态,但不会停止它

Thread.interrupted测试是否设置了中断状态(并清除它),以便添加

if (Thread.interrupted()) {
   return;
}

循环使代码可以中断

答案 3 :(得分:0)

你可以使用interrupted()很好地停止任何长时间运行的线程,通过内部线程中断线程并按Thread.interrupted()检查条件并基于此运行方法。

假设您在某个监视器上阻塞了一个线程,并且其他某个线程被中断,哪个线程将抛出InterruptedException并且可以在状态为true的情况下退出阻塞状态。

我认为中断是实现停止long running task的最佳方法,因为中断会解锁某些阻塞IO和synchronization请求。一个定制的解决方案无法做到这一点。

May help you.

答案 4 :(得分:0)

interrupt()从对象中的标记外部设置,然后Interrupted()方法中的run()可以定期查询该标记。

答案 5 :(得分:0)

我正在摸不着明白,这是什么意思如果线程长时间没有调用抛出InterruptedException的方法怎么办?

答:如果其他线程调用此线程的interupt()方法,并且在调用wait()wait(long)wait(long, int)方法时阻止此线程这个类的Object类,join()join(long)join(long, int)sleep(long)sleep(long, int)的方法,然后是中断状态将被清除,它将收到InterruptedException。否则,只需设置中断状态。

其次,Thread.interrupted()的用法是什么,这是一种线程可以向自身发送中断的方式?这种情况的实际用法是什么?

答:Thread.interrupted()用于检测当前线程的中断状态,如果已设置则返回true,然后清除状态。你检查这个是为了响应其他线程的中断调用,例如抛出InterruptedException并退出线程或者退出。