인프런 커뮤니티 질문&답변

당황한 멧돼지님의 프로필 이미지
당황한 멧돼지

작성한 질문수

더 자바, Java 8

CompletableFuture 2

CompletableFuture의 get 실행에 대해 궁금한 점이 있습니다

작성

·

122

0

안녕하세요.

아래 코드를 실행 시키면, hello 만 출력이 되어야 될것 같은데..world 도 같이 출력이 됩니다. get() 을 하면 동일 scope 에 있는 모든 CompletableFuture 가 실행이 되는것이 맞는 건지 문의 드려요.

 

감사합니다.

 

CompletableFuture<String> hello = CompletableFuture.supplyAsync(
        () -> {
          System.out.println("Hello Thread : " + Thread.currentThread().getName());
          return "Hello";
        }
);

CompletableFuture<String> world = CompletableFuture.supplyAsync(
        () -> {
          System.out.println("World Thread : " + Thread.currentThread().getName());
          return "World";
        }
);

hello.get();

답변 2

0

백기선님의 프로필 이미지
백기선
지식공유자

AI가 댓글을 잘 달았네요. get()하나가 모든 Future를 기다리는건 아닙니다. 그리고 get()은 명시적으로 기다릴 뿐이지, get()을 호출하지 않는다고 Future가 실행이 되지 않는건 아닙니다.

get()을 쓰는 이유는 저 프로그램을 실행한 main 쓰레드가 끝나면 Future가 메시지를 출력하기도 전에 끝나버릴 수 있어서 get()을 사용해서 main 쓰레드가 Future를 기다렸다가 끝낼 수 있도록, 그래야 Future가 메시지를 출력하는지 확인할 수 있으니 그렇게 한 것입니다.

앗! 친히 답글주셔서 감사합니다.

항상 영상과 강의 잘 보고 있어요. ^^



0

안녕하세요, 인프런 AI 인턴입니다.

CompletableFuture.get()를 호출하실 때, 동일 scope 내의 다른 CompletableFuture가 실행되는 것이 아닙니다. CompletableFuture는 각각 독립적으로 비동기 실행됩니다. 여기서 hello.get()을 호출하면, hello가 실행을 완료할 때까지 기다립니다. 그러나, helloworld는 각각 비동기로 실행되기 시작했기 때문에, get()을 호출하기 전에 이미 world가 실행되어 “World Thread : …“가 출력될 수 있습니다.

get() 메소드는 해당 비동기 작업(hello)의 완료를 기다리고 결과를 반환하지만, 다른 비동기 작업(world)의 실행을 제어하거나, 동기화하지는 않습니다. 따라서, 코드 내에서 world 실행이 시작되었을 때, hello.get() 호출로 인해 hello의 완료만 기다리게 되고, world는 독립적으로 실행되어 완료되기 때문에 “World”도 출력되는 것입니다.

님의 질문에 답변이 되었길 바랍니다. 추가적인 궁금증이 있으시면 말씀해주세요.

당황한 멧돼지님의 프로필 이미지
당황한 멧돼지

작성한 질문수

질문하기