中断、关闭方法和ExecutorService

6

直接引用自Java教程:

为了支持立即关闭,任务应该正确处理中断

有人能够表达这个意思吗?任务、中断和关闭方法之间的关系是什么?它是否仅意味着如果有任务正在等待某些东西,则必须抛出InterruptedException异常?

先感谢您的帮助。


请查看此链接:https://dev59.com/AXA65IYBdhLWcg3w2ys2 - Harry.Chen
2个回答

11

想象一下您使用ExecutorService运行此任务

class Task implements Runnable() {
   public void run() {
       while(true) {
       }
   }
}

现在您想使用shutdownNow()方法关闭ExecutorService。ExecutorService将调用正在运行任务的线程的interrupt()方法,但由于任务不响应中断,它将继续运行,ExecutorService将永远无法关闭。

以下更改将使此任务可中断

       while(!Thread.interrupted()) {
       }

并且将允许ExecutorService关闭


3
简单来说,您需要及时在代码中检查interrupt状态。可以使用Thread.currentThread().isInterrupted()来检查。

与其他Unix调用不同的是,在Java中,您只能使用中断与其他线程通信。因此,您无法发送信号等。如果您希望通知另一个线程停止它正在做的任何事情,因为可能不需要,则通过中断该线程是一种合法的通信方式之一。
当您中断线程时,每个线程内部都有一个布尔值,默认为false。因此,文档要求您及时检查布尔值的状态。如果是true,则按照惯例停止进行任何任务并退出循环或其他操作。
尽管interrupt只是一个通知,但是在Java中,按照约定,它被视为关闭请求。您可以将此interrupt状态视为任何您想要的内容(例如:请求发送邮件、获取数据库转储等),但不建议这样做,因为大多数内部Java库都是将其视为关闭请求构建的。
What is InterruptedException for?

java.util.concurrent包中,如果一个线程在awaitgetLock或阻塞队列等地方被阻塞,并且你中断了该线程,则该线程将解除阻塞,库会抛出InterruptedException异常来通知你该线程已被阻塞。
参考资料:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接