現實中有這樣的用法,創建一批在線程池中運行的 CompletableFuture 實例,然後等待它們全部執行完再繼續後面的操作。比如說 AWS 的 Lambda, 單單提交任務到線程池,不等待所有任務全部完成便退出主線程的話,AWS 便認爲 Lambda 執行完畢,無視線程池中正在執行的任務而強行結束該 Lambda 實例。
以往我們通常的作法如下
ExecutorService threadPool = Executors.newFixedThreadPool(10);
List<CompletableFuture<Void>> futures = IntStream.rangeClosed(1, 10000)
.mapToObj(n ->
CompletableFuture.runAsync(() -> {
System.out.println("done " + n);
}, threadPool)).collect(toList());
futures.forEach(CompletableFuture::join);
System.out.println("all done");
如果所有的任務均無異常,上面的代碼能得到預想的結果,只要上面打印出 all done
的話真的就是表明所有的任務都完成了。但是在循環 join futures
中的每一個 CompletableFuture 時,只要碰到任意一個任務有異常時,便立即拋出給外部線程,不在乎是否還有其他任務正在執行。此時,如果外部未予捕獲,當然 閱讀全文 >>