아이템 68. 스레드보다는 실행자와 태스크를 이용하라
68. 스레드보다는 실행자와 태스크를 이용하라
자바 1.5부터 자바 플랫폼에는 java.util.concurrent
가 추가되었다.
이 패키지에는 실행자 프레임워크(Executor Framework)라는 것이 들어 있는데,
유연성이 높은 인터페이스 기반 태스크(task) 실행 프레임워크다.
// 실행자 생성
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(runnable); // 실행
executor.shutdown(); // 셧다운
ExecutorService 추가 기능
- 특정 태스크가 종료되길 대기 :
submit
,get
- 임의의 태스크들이 종료되기를 대기 :
invokeAny
,invokeAll
- 실행자 서비스가 자연스럽게 종료될 수 있도록 대기 :
awaitTermination
- 태스크가 끝날 때 마다 결과 조회 :
ExecutorCompletionService
java.util.Timer 대신 ScheduleThreadPoolExecutor을 추천
- 추상화 수준이 높아서 사용하기 편리하고 유연성이 높음
- 타이밍이 정확함
- 멀티스레드 이용가능
- 무점검 예외 복구 : 예ㅚ를 핸들링 할 피요가 없음
Thread pool
큐의 작업을 처리하는 스레드를 여러개 만들고 싶을 때는 스레드 풀 사용
- 페키지 위치 :
java.util.concurrent.Executors.*
- 일반적이지 않은 무언가가 필요할 때는
ThreadPoolExecutor
클래스를 직접 이용- 일반적인 상황 :
Executors.newCachedThreadPool
- 부하가 큰 상황 :
Executors.newFixedThreadPool
,ThreadPoolExecutor
- 일반적인 상황 :
작업 단위(task)
Runnable
Callable
:Runnable
과 비슷하지만 값을 반환함
결론
중요한 것은 Thread가 아니라, __작업와 실행 메커니즘이 분리된 것__이다.