ExecutorService
를 알아보기 전에 Executors
를 알아볼 필요가 있다.
Executors
는 Executor
, ExecutorService
, ScheduledExecutorService
, ThreadFactory
, Callable
등 멀티 쓰레드를 기반으로 실행되는 인터페이스들의 팩터리 클래스이다.
특히 ThreadPoolExecutor
생성자를 통해서 ExecutorService
구현체를 제공해준다.
ExecutorService
는 JAVA 에서 병렬 처리를 위해 제공되는 라이브러리이다.
ExecutorService
없이 병렬 처리를 구현하기 위해서는 Thread
의 생성, 제거를 손수 진행해야 한다. 하지만, 이러한 일련의 과정을 ExecutorService
라는 클래스를 사용해서 쉽게 처리할 수 있다.
흔히 말하는 ThreadPool
을 구현하기 매우 용이하기 때문에 ThreadPool
을 생성해서 사용하고자 한다면 반드시 사용을 고려해볼 필요가 있다.
Runnable
이나 Callable
인터페이스를 구현한 Task
의 실행과 종료를 수행한다. Queue
로 관리되는 Task
는 순차적으로 스레드에 할당된다.
CachedThreadPool
FixedThredPool
SingleThraedExecutor
race condition
같은 부분들을 알아서 처리해준다ScheduledThreadPool
ForkJoinPool
Task
의 크기에 따라서 분할(Fork
)하고, 분할된 Task
가 처리되면 그것을 합쳐(Join
) 리턴한다.ThreadPoolExecutor
사용ExecutorService executorService = new ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue);
ExecutorService executorService = new ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler);
ExecutorService executorService = new ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler);
Executors
의 정적 팩터리 메서드 사용ExecutorService executorService = Executors.newCachedThreadPool();
ExecutorService executorService = Executors.newFixedThreadPool(int nThreads);
ExecutorService executorService = Executors.newSingleThreadExecutor();
execute()
submit()
Runnable
이나 Callable
객체를 전달한다. Future
객체를 반환받기 때문에 제출한 Task의 진행 상태를 추적할 수 있다.Future
의 future.get()
이 null
이면 정상 완료된 것이다.invokeAny()
Callable
들은 취소한다.invokeAll()
List<Future<>>
형태로 반환한다.shutdown()
shutdownNow()
awaitTermination()