直接来自这个java教程:
为了支持立即关闭,任务应该处理中断 正确地
有人能说出这一点吗?任务和中断与关机方法之间的关系是什么? 仅是否意味着如果有任务等待它必须抛出InterruptedException
的内容?
提前致谢。
答案 0 :(得分:8)
想象一下,您使用ExecutorService
运行此任务class Task implements Runnable() {
public void run() {
while(true) {
}
}
}
现在要使用shutdownNow()关闭ExecutorService。 ExecutorService将在运行任务的线程上调用interrupt(),但由于任务没有响应中断,因此它将继续运行,ExecutorService将永远不会关闭。
以下更改将使此任务可中断
while(!Thread.interrupted()) {
}
并允许ExecutorService关闭
答案 1 :(得分:3)
它只是意味着您及时检查代码中的interrupt
状态。可以使用Thread.currentThread().isInterrupted()
检查此内容。
在Java中,与其他Unix调用不同,您只有中断与其他线程通信。因此,您无法发送信号等。如果您希望通知另一个线程停止正在执行的操作,因为它可能不需要,那么通信的合法方式之一就是通过中断该线程。
中断线程会发生什么?
每个线程在内部都有一个布尔值,默认为false
。当您中断线程时,此布尔值设置为true。因此,文档要求您及时检查布尔值的状态。如果true
,则惯例是停止执行任何任务并退出循环或其他任何事情。
虽然interrupting
一个帖子只是一个通知。但按照Java中的惯例,它被视为关闭请求。您可以将此interrupt
状态视为您想要的任何内容(例如:请求发送邮件,进行数据库转储等)但不建议这样做,因为大多数内部Java库都是根据请求关闭而构建的。
What is InterruptedException for?
在java.util.concurrent
包中,如果线程被阻塞(在await
或getLock
或在blockign队列中等),则使用某个类,并中断该线程。取消阻止库被抛出InterruptedException以通知您线程被阻止。
参考文献: