2017-02-16 225 views
2

我有這種情況,其中有10個或更多的任務被分組爲多個組。在這些組中,一切都應該同時運行,但是因爲每個組都需要前一個組的結果(除了第一個組),我需要按順序運行它們(組內的任務不需要按順序運行)。在保持非阻塞狀態下,有序地執行了許多CompletableFuture.allof()

任務本身是從數據庫查詢數據,然後應用一些轉換並將其保存回數據庫。

Task 1.1 // This group run first 
Task 1.2 

Task 2.1 // Waiting results from group 1 
Task 2.2 
Task 2.3 

Task 3.1 // Waiting results from group 2 

我想使用的allOf()列表,重複它,然後顯式調用get()爲每個allOf()的,但它會阻止,我不希望它發生,所以我的問題是,如何執行很多allOf()爲了? iteven有可能在這裏只使用CompletableFuture

回答

1

當您使用allOf()時,它將返回一個CompletableFuture,只有在完成所有給定完成階段後纔會完成。

如果您從返回的將來連鎖呼叫,他們因此可以保證傳遞給allOf()的任何完成階段的呼叫get()永遠不會阻止(因爲它們已經完成)。

// First group 
CompletableFuture<Integer> task11 = CompletableFuture.supplyAsync(() -> 1); 
CompletableFuture<Integer> task12 = CompletableFuture.supplyAsync(() -> 42); 
CompletableFuture<Integer> task13 = CompletableFuture.supplyAsync(() -> 1729); 

// this one will complete after all tasks from the first group complete 
CompletableFuture<Void> allFirstTasks = CompletableFuture.allOf(task11, task12, task13); 

// Second group will be child tasks from the first group 
CompletableFuture<Integer> task21 = allFirstTasks.thenApply(__ -> 
     task11.join() + task12.join() + task13.join() // will not block 
); 

注:使用join()代替get()避免檢查的異常處理。