gpt4 book ai didi

java - 在 Java 中等待 ThreadPoolExecutor 完成线程的最佳方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:15:34 24 4
gpt4 key购买 nike

我在 java 中使用 ThreadPoolExecutor 来执行多线程,我必须在线程完成后做一些事情,并且必须等待。

所以我想问一下最好的方法是什么?

我这样做对吗?

threadPool.shutdown();

boolean loop = true;
Integer x = threadPool.getPoolSize();
while (threadPool.getPoolSize() != 0) {
}

最佳答案

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

    executor.shutdown();
System.out.println("All tasks submitted...No new tasks will be admitted");

但是,我强烈建议使用 awaitTermination,因为这将允许当前线程阻塞,直到所有任务在关闭请求后完成执行,或者发生超时,或者当前线程被中断,以先发生者为准。

    try {
executor.awaitTermination(3, TimeUnit.SECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}

编辑:

 The runState provides the main lifecyle control, taking on values:

* RUNNING: Accept new tasks and process queued tasks
* SHUTDOWN: Don't accept new tasks, but process queued tasks
* STOP: Don't accept new tasks, don't process queued tasks,
* and interrupt in-progress tasks
* TIDYING: All tasks have terminated, workerCount is zero,
* the thread transitioning to state TIDYING
* will run the terminated() hook method
* TERMINATED: terminated() has completed

这些值之间的数字顺序很重要,以便进行有序比较。 runState 随时间单调增加,但不需要达到每个状态。过渡是:

正在运行 -> 关机
在调用 shutdown() 时,可能隐含在 finalize() 中

(运行或关机)-> 停止
在调用 shutdownNow() 时

关机 -> 整理
当队列和池都为空时

停止 -> 整理
当池为空时

正在整理 -> 已终止
当 terminated() Hook 方法完成时。当状态达到 TERMINATED 时,在 awaitTermination() 中等待的线程将返回。

检测从 SHUTDOWN 到 TIDYING 的转换没有你想的那么简单,因为在 SHUTDOWN 状态期间队列可能在非空之后变为空,反之亦然,但我们只能在看到队列为空后终止,我们看到 workerCount 为 0。

回到您的问题,当您调用 getPoolSize() 时,它会检查线程池处于 TIDYING 状态时的状态。因此,我认为正确的检查应该针对 TERMINATED 状态。虽然,如果您没有实现 terminated() 方法,结果是相同的。

关于java - 在 Java 中等待 ThreadPoolExecutor 完成线程的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36215327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com