2017-08-03 55 views
13

是什麼completablefuture加入VS得到

下面是我的代碼CompletableFuture.get()和CompletableFuture.join()之間的區別:

List<String> process() { 

    List<String> messages = Arrays.asList("Msg1", "Msg2", "Msg3", "Msg4", "Msg5", "Msg6", "Msg7", "Msg8", "Msg9", 
      "Msg10", "Msg11", "Msg12"); 
    MessageService messageService = new MessageService(); 
    ExecutorService executor = Executors.newFixedThreadPool(4); 

    List<String> mapResult = new ArrayList<>(); 

    CompletableFuture<?>[] fanoutRequestList = new CompletableFuture[messages.size()]; 
    int count = 0; 
    for (String msg : messages) { 
     CompletableFuture<?> future = CompletableFuture 
       .supplyAsync(() -> messageService.sendNotification(msg), executor).exceptionally(ex -> "Error") 
       .thenAccept(mapResult::add); 

     fanoutRequestList[count++] = future; 
    } 

    try { 
     CompletableFuture.allOf(fanoutRequestList).get(); 
     //CompletableFuture.allOf(fanoutRequestList).join(); 
    } catch (InterruptedException | ExecutionException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return mapResult.stream().filter(s -> !s.equalsIgnoreCase("Error")).collect(Collectors.toList()); 
} 

我試圖與這兩種方法,但沒有什麼區別結果。

謝謝

+4

'得到()'需要你捕獲檢查的異常。當你從'get()'改變到'join()'時你應該注意到它的區別,因爲你會立即得到一個編譯器錯誤,說'try'塊中沒有拋出'InterruptedException'和'ExecutionException'。 – Holger

+1

@ holi-java:'join()'不能被打斷。 – Holger

+0

@霍爾是的,先生。我發現我不能打斷任務。 –

回答

7

唯一的區別是方法如何拋出異常。 get()聲明中Future接口

V get() throws InterruptedException, ExecutionException; 

例外都是檢查異常,這意味着他們需要在你的代碼來處理。正如您在代碼中看到的那樣,IDE中的自動代碼生成器會詢問是否代表您創建try-catch塊。

try { 
    CompletableFuture.allOf(fanoutRequestList).get() 
} catch (InterruptedException | ExecutionException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

join()方法不拋出檢查例外。

public T join() 

相反,它拋出選中 CompletionException。所以你並不需要一個try-catch塊,而是使用disscused List<String> process功能

CompletableFuture<List<String>> cf = CompletableFuture 
    .supplyAsync(this::process) 
    .exceptionally(this::getFallbackListOfStrings) // Here you can catch e.g. {@code join}'s CompletionException 
    .thenAccept(this::processFurther); 

時,你可以充分利用exceptionally()方法你可以找到既get()join()實施here