Program Tip

completablefuture 조인 대 get

programtip 2021. 1. 8. 22:12
반응형

completablefuture 조인 대 get


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());
}

두 가지 방법으로 시도했지만 결과에는 차이가 없습니다.

감사


유일한 차이점은 메서드가 예외를 throw하는 방법입니다. 인터페이스에서 다음과 같이 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()메서드는 확인 된 예외를 throw하지 않습니다 .

public T join()

Instead it throws unchecked CompletionException. So you do not need a try-catch block and instead you can fully harness exceptionally() method when using the disscused List<String> process function

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

You can find both get() and join() implementation here

ReferenceURL : https://stackoverflow.com/questions/45490316/completablefuture-join-vs-get

반응형