본문 바로가기
Language/Java

CompletionService의 take()의 용도

by fabxoe 2019. 8. 30.

이것이 자바다 - 12장 멀티스레드 작업 - 완료 순으로 통보

 

스레드 풀의 스레드가 꼭 의도한 작업처리를 위해서만 사용된다는 관점에서 벗어나서

다른 작업들의 완료된 작업을 콘솔로 출력하는 코드도 작업으로 만들어 

스레드 풀의 작업큐에 넣으므로써 스레드풀의 스레드가 결과 값을

받아 내는 작업을 실행하도록 한다.

 

즉, 기존에 ExcutorService의 get()만으로 사용하던 방식에서는

Future<Result> future1 = excutorService.submit(task1, result);
Future<Result> future2 = excutorService.submit(task1, result);

result = future1.get();
result = future2.get();

future2 작업이 먼저 끝났다 하더라도

future1 작업이 아직 스레드에서 진행중이면

main스레드가 블록킹되어 있어서 future2의 결과를 리턴해 줄 수 없는 상황이였지만,

 

CompletionService의 take()를 이용하는 방식에서는

결과값을 받는 부분을 main스레드가 아닌 별도의 작업으로 만들어 다른 스레드에 넣음으로써

main스레드의 블록킹현상이 일어나지 않아 main에서 다른작업도 진행할 수 있는 효과를 얻게된다.

 

 

참조: https://cafe.naver.com/thisisjava/5629

댓글