작성
·
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
가 실행을 완료할 때까지 기다립니다. 그러나, hello
와 world
는 각각 비동기로 실행되기 시작했기 때문에, get()
을 호출하기 전에 이미 world
가 실행되어 “World Thread : …“가 출력될 수 있습니다.
get()
메소드는 해당 비동기 작업(hello
)의 완료를 기다리고 결과를 반환하지만, 다른 비동기 작업(world
)의 실행을 제어하거나, 동기화하지는 않습니다. 따라서, 코드 내에서 world
실행이 시작되었을 때, hello.get()
호출로 인해 hello
의 완료만 기다리게 되고, world
는 독립적으로 실행되어 완료되기 때문에 “World”도 출력되는 것입니다.
님의 질문에 답변이 되었길 바랍니다. 추가적인 궁금증이 있으시면 말씀해주세요.
앗! 친히 답글주셔서 감사합니다.
항상 영상과 강의 잘 보고 있어요. ^^