当池中仍有线程运行时,为什么 executor.isShutdown() 返回 true?

rai*_*pak 0 java multithreading thread-safety

shutdown() 的 Java 文档说:

关闭

无效关闭()

启动有序关闭,其中执行先前提交的任务,但不会接受新任务。如果已经关闭,则调用不会产生任何附加效果。该方法不等待之前提交的任务完成执行。使用awaitTermination 来做到这一点。

这两种说法不是矛盾吗?(...之前提交的任务执行完毕VS不等待之前提交的任务完成执行)?

我尝试了一个示例程序shutdown()。而且它确实等待先前提交的任务完成,这与shutdownNow()

为什么下面的代码I have shutdown true在应该等待阶乘任务完成时返回?

public class RunnableMain {

    public static void main(String[] args) {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        RunnableFactorialTask runnableFactorialTask = new RunnableFactorialTask(5);
        executor.submit(runnableFactorialTask);
        executor.shutdown();
        System.out.println(" I have shutdown.."+executor.isShutdown());
    }
}

class RunnableFactorialTask implements Runnable {

    private int num = 0;

    public RunnableFactorialTask(int num) {
        this.num = num;
    }

    @Override
    public void run() {
        int factorial = 1;
        try {
            Thread.currentThread().sleep(6000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        for (int i = 2; i <= num; i++) {
            factorial *= i;
        }
        System.out.println("factorial of :" + num + " =" + factorial);
    }
}
Run Code Online (Sandbox Code Playgroud)

And*_*asT 5

shutdownNow()或 的调用shutdown()不会被阻塞。这就是文档中提到的内容。因此,如果您致电 shutdown()shutdownNow(),您会立即恢复控制权,而不仅仅是在一切正常关闭之后。如果您想在调用 后等待所有执行程序/线程终止shutdown[Now](),则必须调用awaitTermination(...),这将阻塞直到所有内容都被清理干净。这可能就是您想要的。另请参阅此处类似问题的答案:Executor Service shutdown 和 shutdownNow 之间的差异