【问题标题】:what happens to running/blocked runnables when executorservice is shutdown()当 executorservice 关闭()时,运行/阻塞的可运行对象会发生什么
【发布时间】:2010-06-10 21:44:07
【问题描述】:

我今天发了question 一个关于线程模式的帖子,几乎所有人都建议我研究一下 ExecutorService。

当我查看 ExecutorService 时,我想我遗漏了一些东西。如果服务有一个正在运行或阻塞的线程,并且有人调用了 ExecutorService.shutdown(),会发生什么。正在运行或阻塞的线程会发生什么情况?

ExecutorService 是否在终止之前等待这些线程完成?

我问这个的原因是因为很久以前当我涉足 Java 时,他们弃用了 Thread.stop(),我记得停止线程的正确方法是使用信号量并在必要时扩展 Thread:

public void run () {
    while (!this.exit) {
        try {
            block();
            //do something
        } catch (InterruptedException ie) {
        }
    }
}

public void stop () {
    this.exit = true;

    if (this.thread != null) {
        this.thread.interrupt();
        this.thread = null;
    }
}

ExecutorService 如何处理正在运行的线程?

【问题讨论】:

    标签: java multithreading design-patterns executorservice


    【解决方案1】:

    来自ExecutorService#shutdown()

    启动有序关闭,其中执行先前提交的任务,但不会接受新任务。如果已经关闭,则调用没有额外的效果。

    所以它会等待那些线程完成。

    另一种选择是ExecutorService#shutdownNow()

    尝试停止所有正在执行的任务,停止等待任务的处理,并返回等待执行的任务列表。

    除了尽力停止处理正在执行的任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt() 取消,因此任何未能响应中断的任务都可能永远不会终止。

    您只需要自己在run() 内的while 循环中收听Thread#isInterrupted()

    【讨论】:

    • shutdown() 的文档中没有任何内容表明线程将被中断。 shutdownNow() 的文档表明,实现可能会中断正在运行的任务,但不需要它。
    • 为避免混淆,我在编辑答案以正确匹配文档之前发表了我的评论。
    • 我知道。当一个人发布一个有用的答案,另一个人发布一个恰好有更多细节的虚构事实,然后后来修复它并获得荣誉时,这让我很恼火...... ;-)
    【解决方案2】:

    我认为文档很清楚!从内存中,它会一直等到线程完成,除非你用 shutdownNow() 方法告诉它。

    【讨论】:

      猜你喜欢
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多