为了账号安全,请及时绑定邮箱和手机立即绑定

了解 Executor Service 何时完成所有提交的任务的最佳方法是什么

了解 Executor Service 何时完成所有提交的任务的最佳方法是什么

叮当猫咪 2021-08-25 17:45:37
这里有两种选择,只是有点混淆哪个最好去。选项1:ExecutorService es = Executors.newFixedThreadPool(4);List<Runnable> tasks = getTasks();CompletableFuture<?>[] futures = tasks.stream()                               .map(task -> CompletableFuture.runAsync(task, es))                               .toArray(CompletableFuture[]::new);CompletableFuture.allOf(futures).join();    es.shutdown();选项 2:ExecutorService es = Executors.newFixedThreadPool(4);List< Future<?>> futures = new ArrayList<>();for(Runnable task : taskList) {    futures.add(es.submit(task));}for(Future<?> future : futures) {    try {        future.get();    }catch(Exception e){        // do logging and nothing else    }}es.shutdown();在这里放置 future.get(); 在 try catch 中是个好主意,对吗?
查看完整描述

1 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

还有另一种等待所有任务完成的方法。提交所有任务后,调用

es.shutdown()
es.awaitTermination(Long.MAX_VALUE, TimeUnit.NANO_SECONDS)

Oracle 的 Java 文档如下:

shutdown [...] 启动有序关闭,其中执行先前提交的任务。

awaitTermination [...] 阻塞直到所有任务在关闭请求后完成执行,或者超时发生,或者当前线程被中断,以先发生者为准。

关于超时:使用上述值,线程池将仅在大约 300 年后终止。


查看完整回答
反对 回复 2021-08-25
  • 1 回答
  • 0 关注
  • 152 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信