초기 자바에서는 Thread 클래스를 직접 사용하여 스레드를 생성하고 관리했다. 하지만 해당 방식은 너무 로우했고, 좀더 편리하게 멀티스레딩을 다루기 위해 Java5에서부터 java.util.concurrent 패키지가 도입되었다.

해당 패키지에는 Executor 프레임워크가 제공되었는데 이 프레임워크는 스레드 생성을 추상화하고, 비동기 작업의 실행을 단순화하여 어려운 멀티스레드 프로그래밍을 좀 더 간편하게 구현할 수 있도록 도와주었다.

Executor, ExecutorService, ThreadPoolExecutor는 이 프레임워크의 핵심 구성요소로 이에 대해 알아보자.

Executor

public interface Executor {
    void execute(Runnable command);
}

ExecutorService

public interface ExecutorService extends Executor, AutoCloseable {
	...다양한 메서드...
}

ThreadPoolExecutor

ThreadPoolExecutor(
    int corePoolSize,           // 스레드 풀의 기본 크기
    int maximumPoolSize,        // 스레드 풀의 최대 크기
    long keepAliveTime,         // 유지 시간
    TimeUnit unit,              // 유지 시간의 단위 (초, 밀리초 등)
    BlockingQueue<Runnable> workQueue, // 작업을 대기시키는 큐
    RejectedExecutionHandler handler   // 작업이 거부될 때의 처리 방식
)

각각을 알아보자

  1. corePoolSize: 기본적으로 유지할 스레드의 수