这里有两种选择,只是有点混淆哪个最好去。选项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 年后终止。
添加回答
举报
0/150
提交
取消