java executorservice 无响应,java – ExecutorService awaitTermination方法未按预期执行

我正在尝试用

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

List 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对象都有一个运行方法,该方法进行Web服务调用,然后将调用结果写入数据库,包括调用完成的时间. completeThisProcess方法简单地将整个过程的状态与过程完成的时间一起写入.

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

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

最佳答案 如果要等待所有线程返回,则可以信任以下方法.

使你的线程类实现Callable接口而不是Runnable(如果Callable run方法将返回一些值.让它返回threadName.

创建可调用对象列表并使用invokeAll方法,该方法将等待所有线程返回.对于以下代码,假设线程类名称为MyCallable.

ExecutorService executorService = Executors.newFixedThreadPool(foos.size());

List 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()方法使其在run方法中倒计时.

for循环后使用cdl.await然后等待,直到cdl变为零.

标题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值