[CS/운영체제] 멀티스레드와 동시성 - 36부

황제연·2025년 8월 7일
0

CS학습

목록 보기
159/193
post-thumbnail

Future가 필요한 이유

Future<Integer> future1 = service.submit(task1);
Future<Integer> future2 = service.submit(task2);

Integer res1 = future1.get();
Integer res2 = future2.get();

위와 같은 예제코드는 future를 통해서 결과를 반환받고 있습니다
만약 Future 없이 결과를 반환한다면 결과적으로 task1의 결과를 기다린 다음에 task2를 요청하게 될 것입니다
그렇게 되면 한 작업을 완료하는데 5초가 걸린다면 총 10초의 대기가 걸릴 것입니다
이것은 싱글 스레드가 작업한 결과와 비슷한 결과입니다

하지만 위와같이 Future를 사용한다면 개별 스레드에서의 결과를 각각 기다리므로
res1을 5초동안 기다리면서 res2 작업도 진행되기 때문에, 총 5초의 대기 시간이 걸릴 것입니다

잘못 사용한 예

Future<Integer> future1 = service.submit(task1);
Integer res1 = future1.get();
Future<Integer> future2 = service.submit(task2);
Integer res2 = future2.get();

이렇게 사용하면, res1이 완료될때까지 기다렸다가 task2를 실행하므로
결과적으로 10초의 대기시간이 걸릴 것입니다

정리

Future라는 개념이 없으면 결과를 받을 때까지 요청 스레드는 아무것도 못하고 대기해야합니다
따라서 다른 작업을 동시에 수행할 수 없습니다

Future 덕분에 요청 스레드는 대기하지 않고 다른 작업을 수행할 수 있습니다
다른 작업을 더 요청할 수 있고 모든 작업 요청이 끝나고나서 본인이 필요할 때 Future.get()을 호출해서
최종 결과를 받을 수 있습니다

Future를 사용하는 경우 결과적으로 두 task를 동시에 요청할 수 있습니다
그렇기 때문에 한 작업의 블로킹만 걸리고 나머지는 동시에 수행되어서 대기없이 받을 수 있습니다

정리하면 Future는 요청 스레드를 블로킹 상태로 만들지 않고 필요한 요청을 모두 수행할 수 있게 합니다
필요한 모든 요청을 한 다음에 Future.get()을 통해 블로킹 상태로 대기하고 결과를 받으면 됩니다
이러한 이유 때문에 ExecutorService는 결과를 직접 반환하지 않고 Future를 반환합니다

참고

  • 김영한의 실전 자바 - 고급 1편
profile
Software Developer

0개의 댓글