3

今天发了一个关于线程模式的问题,几乎所有人都建议我看一下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 如何处理正在运行的线程?

4

2 回答 2

9

来自ExecutorService#shutdown()

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

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

另一种选择是ExecutorService#shutdownNow()

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

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

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

于 2010-06-10T21:48:11.533 回答
1

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

于 2010-06-10T21:47:43.910 回答