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