我正在阅读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(),这是一种方式,该线程可以向自己发送一个中断?什么是 这种情况的实际用法?感谢。
答案 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
请求。一个定制的解决方案无法做到这一点。
答案 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
并退出线程或者退出。