【问题标题】:ExecutorService awaitTermination method not performing as expectedExecutorService awaitTermination 方法未按预期执行
【发布时间】:2015-02-02 18:32:00
【问题描述】:

我正在尝试用 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 方法显然能够在所有 MyRunnables 完成之前执行。我注意到,在最后一个 MyRunnable 任务完成之前,从 completeThisProcess 方法写入的时间有时甚至超过 20-30 秒。

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

【问题讨论】:

  • 不可能在 Java 中“编写进程”。您正在编译 BYTECODE,然后由您的虚拟机解释和执行
  • 他的意思不是字面的过程。只是一个做某事的应用程序。
  • 我什至不知道如何回复你。我一般使用术语过程。我正在写一个算法,这样更好吗?请更加迂腐。
  • @jagerads 更多的上限,无论如何...我猜你的MyRunnable 类有问题。您对 ExecutorService 的使用看起来不错。
  • 如果你确定 runnable 没问题但仍然找不到问题,我会考虑在 ExecutorService 之外按顺序执行所有这些,看看是否可行。

标签: java concurrency threadpool executorservice


【解决方案1】:

如果您想等待所有线程返回,则可以信任以下方法。 让你的线程类实现Callable接口而不是Runnable(如果Callablerun方法将返回一些值。让它返回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 返回未来对象的列表。

你可以使用CountDownLatch

CountDownLatch cdl = new CountDownLatch(foo.size);

使用cdl.countDown() 方法使其在运行方法中倒计时。 在for循环之后使用cdl.await,然后它会一直等到cdl变为零。

标题

【讨论】:

    猜你喜欢
    • 2011-10-26
    • 2023-03-24
    • 2013-08-20
    • 2017-12-15
    • 2011-02-25
    • 2012-11-23
    • 2014-10-20
    • 2015-09-17
    • 2015-07-22
    相关资源
    最近更新 更多