gpt4 book ai didi

java - ExecutorService awaitTermination 方法未按预期执行

转载 作者:搜寻专家 更新时间:2023-11-01 03:22:17 27 4
gpt4 key购买 nike

我正在尝试用 Java 编写一个流程,它同时执行一系列任务,等待任务完成,然后将整个流程标记为已完成。每个任务都有自己的信息,包括单个任务何时完成。我正在为流程使用 ExecutorService,并将流程的本质归结如下:

List<Foo> foos = getFoos();
ExecutorService executorService = Executors.newFixedThreadPool(foos.size());
for (Foo foo : foos) {
executorService.execute(new MyRunnable(foo));
}

executorService.shutdown();

try {
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// log the error.
}

completeThisProcess();

每个 MyRunnable 对象都有一个 run 方法,该方法调用 Web 服务,然后将调用结果写入数据库,包括调用完成的时间。 completeThisProcess 方法简单地将整个过程的状态写为完成以及过程完成的时间。

我遇到的问题是,当我在进程完成后查看数据库时,completeThisProcess 方法显然能够在所有 MyRunnable 完成之前执行。我注意到从 completeThisProcess 方法写入的时间甚至偶尔会在最后一个 MyRunnable 任务完成之前超过 20-30 秒。

我写的过程有什么明显的错误吗?也许我没有正确理解 ExecutorService,但我认为 awaitTermination 方法应该确保所有 MyRunnable 实例都已完成其运行方法(当然假设它们无一异常(exception)地完成),这将导致所有子 -完成时间早于整个过程完成时间的任务。

最佳答案

如果您想等待所有线程返回,那么可以信任以下方法。让你的线程类实现 Callable 接口(interface)而不是 Runnable (如果是 Callable run 方法将返回一些值。让它返回 threadName。

创建一个 Callable 对象列表并使用 invokeAll 方法等待所有线程返回。对于以下代码,假设线程类名称为 MyCallable。

ExecutorService executorService = Executors.newFixedThreadPool(foos.size());
List<Callable> tasks = new ArrayList<>();
for (Foo foo : foos) {
tasks.add(new MyCallable(foo));
}
executorService.invokeAll(tasks);

如果您想使用它,invokeAll 会返回 future 对象的列表。

您可以使用 CountDownLatch

CountDownLatch cdl = new CountDownLatch(foo.size);

使用 cdl.countDown() 方法在 run 方法中让它倒计时。在 for 循环之后使用 cdl.await 然后它将等待直到 cdl 变为零。

标题

关于java - ExecutorService awaitTermination 方法未按预期执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27301473/

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