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

这里有两种选择,只是有点混淆哪个最好去。


选项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 中是个好主意,对吗?


叮当猫咪
浏览 153回答 1
1回答

缥缈止盈

还有另一种等待所有任务完成的方法。提交所有任务后,调用es.shutdown() es.awaitTermination(Long.MAX_VALUE,&nbsp;TimeUnit.NANO_SECONDS)Oracle 的 Java 文档如下:shutdown&nbsp;[...] 启动有序关闭,其中执行先前提交的任务。awaitTermination&nbsp;[...] 阻塞直到所有任务在关闭请求后完成执行,或者超时发生,或者当前线程被中断,以先发生者为准。关于超时:使用上述值,线程池将仅在大约 300 年后终止。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java