이것이 자바다 - 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에서 다른작업도 진행할 수 있는 효과를 얻게된다.
'Language > Java' 카테고리의 다른 글
LOG4J2와 로깅 라이브러리 (0) | 2020.06.11 |
---|---|
얕은 복사를 피하기 위해서 참조객체는 clone을 재구현해야 한다? (0) | 2019.10.21 |
타입파라미터를 제한하는 방법은 두가지이다. (0) | 2019.09.02 |
Thread상태상수인 WAITING, BLOCKED와 상태제어 메소드인 wait()과 notify()의 관계 (0) | 2019.09.01 |
Future<T> submit(Runnable task, T result)는 무엇을 리턴하나? (0) | 2019.08.31 |
댓글