초기 자바에서는 Thread 클래스를 직접 사용하여 스레드를 생성하고 관리했다. 하지만 해당 방식은 너무 로우했고, 좀더 편리하게 멀티스레딩을 다루기 위해 Java5에서부터 java.util.concurrent
패키지가 도입되었다.
해당 패키지에는 Executor 프레임워크가 제공되었는데 이 프레임워크는 스레드 생성을 추상화하고, 비동기 작업의 실행을 단순화하여 어려운 멀티스레드 프로그래밍을 좀 더 간편하게 구현할 수 있도록 도와주었다.
Executor, ExecutorService, ThreadPoolExecutor는 이 프레임워크의 핵심 구성요소로 이에 대해 알아보자.
public interface Executor {
void execute(Runnable command);
}
public interface ExecutorService extends Executor, AutoCloseable {
...다양한 메서드...
}
submit()
) → Runnable, Callable 모두 인자로 받음invokeAll()
, invokeAny()
)shutdown()
, shutdownNow()
)ThreadPoolExecutor(
int corePoolSize, // 스레드 풀의 기본 크기
int maximumPoolSize, // 스레드 풀의 최대 크기
long keepAliveTime, // 유지 시간
TimeUnit unit, // 유지 시간의 단위 (초, 밀리초 등)
BlockingQueue<Runnable> workQueue, // 작업을 대기시키는 큐
RejectedExecutionHandler handler // 작업이 거부될 때의 처리 방식
)
각각을 알아보자
ThreadPoolExecutor.prestartAllCoreThreads()
이 메서드를 사용해서 미리 채워주자.