等待所有的 CompletableFuture 完成

現實中有這樣的用法,創建一批在線程池中運行的  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 時,只要碰到任意一個任務有異常時,便立即拋出給外部線程,不在乎是否還有其他任務正在執行。此時,如果外部未予捕獲,當然 閱讀全文 >>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章