首页 > 解决方案 > 为什么在 exec.shutdown() 之前使用 exec.isTerminated() 和 java 中的 ExecutorService?

问题描述

我正在研究线程并遇到以下代码并有一些担忧

ExecutorService exec = Executors.newFixedThreadPool(2);

exec.execute(left);
exec.executed(right);

if (!exec.isTerminated()) {
    exec.shutdown();
    exec.awaitTermination(5L, TimeUnit.SECONDS);
}

int result = left.getResult() + right.getResult();

如果所有任务都终止,则 if 条件将为 False 并且线程池不会终止,因为在 if 条件之外没有关闭命令。

以下是正确的:

  1. 那么如果外面也应该关闭吗?

  2. 为什么甚至有 if 条件 shutdown() 等待所有预先提交的任务完成,我们甚至可以摆脱 awaitTermination()?

标签: javathreadpoolexecutorserviceexecutor

解决方案


没有理由打电话isTerminated()。从文档中

请注意,除非先调用或调用,否则isTerminated永远不会。trueshutdownshutdownNow

因此,exec.isTerminated()在该代码中始终是错误的。该if语句毫无意义,因为它的主体将始终执行。

shutdown()方法不等待任何东西:

启动有序关闭,其中执行先前提交的任务,但不会接受新任务。

因此,awaitTermination调用仍然有用。(但假设 5 秒就足够了是不安全的;有更好的方法来确保所有提交的任务都已完成。)


推荐阅读