Executor 는 쓰레드 풀의 구현을 위한 인터페이스이다.
- 등록된 작업을 실행
- 작업 실행을 책임
public interface Executor {
void execute(Runnable command);
}
Executors 는 Executor, ExecutorService, ScheduledExecutorService, ThreadFactory 등을 위한 정적 팩토리 메서드를 지원해주는 클래스다.
- newFixedThreadPool(int n)
- 고정된 쓰레드 풀을 생성한다.
- CPU 코어 수 기준으로 생성 시 좋은 성능을 얻을 수 있다.
- newCachedThreadPool()
- 필요한 만큼 쓰레드 풀을 생성한다.
- 쓰레드를 캐싱하는 쓰레드풀
- 일정 시간 동안 쓰레드를 검사하여 60초 동안 작업이 없으면 Pool에서 제거한다.
- 쓰레드의 제한 없이 생성하고, 작업이 60초간 없을 경우 Pool에서 제거하는 방식이기 때문에 작업이 계속적으로 쌓이는 환경에서는 해당 쓰레드에서 소멸되는 것보다 생성되는 것이 더 많을 수 있다.
- newSingleThreadExecutor()
- 단일 쓰레드로 이루어진 쓰레드 풀을 생성한다.
- 큐에 있는 작업을 순차적으로 처리한다.
- newScheduledThreadPool(int n)
- 고정된 크기의 쓰레드 풀을 생성하고 예약된 시간에 일정한 시간 간격으로 작업을 수행하도록 하는 스케줄링하는 쓰레드 풀
- 일정 시간마다 혹은 주기적으로 반복해야하는 일에 대한 병렬 작업을 위해 사용
ExecutorService 는 java에서 제공되는 인터페이스로, 쓰레드 풀을 관리하고 작업을 비동기적으로 실행하는 기능을 제공합니다.
- Task를 지정해주면 쓰레드 풀을 이용해서 Task를 실행하고 관리한다.
- Task는 BlockingQueue로 관리한다.
- 쓰레드 풀에 있는 쓰레드 수 보다 Task가 많으면 실행되지 않은 Task는 Queue에 저장되고, 순차적으로 수행된다.
주요 기능
- 쓰레드 풀 관리 : 내부적으로 쓰레드 풀을 관리하여 쓰레드 생성 및 종료 오버 헤드를 줄입니다.
- 작업 : 작업을 제출, 취소, 완료 대기하는 기능을 제공 합니다.
- 종료 : 쓰레드 풀을 정상적으로 종료하거나 강제로 종료할 수 있습니다.
주요 메서드
- execute : 주어진 작업을 실행한다.
- submit : 주어진 작업을 실행하고 Future 타입의 결과를 받는다. 결과 리턴을 위해 Callable을 구현할 Task를 인자로 주어야한다.
- invokeAny : Task를 Collection에 넣어서 넘겨준다. 실행에 성공한 Task 중 하나의 리턴값을 반환한다.
- invokeAll : Task를 Collection에 넣어서 인자로 넘겨줄 수 있다. 모든 Task의 리턴 값을 List<Future<>>로 반환한다.
- shutdown : 실행 중인 모든 Task가 수행되면 종료
- shutdownNow : 실행 중인 쓰레드들을 즉시 종료시키고 하지만 모든 쓰레드가 동시에 종료되는 것을 보장하지는 않고 실행되지 않는 Task를 반환합니다.
Graceful shutdown
- Graceful Shutdown은 진행되면 더 이상의 요청은 거부하고, 처리 중인 요청이 있다면 마무리하고 종료시킨다.
private void shutdownAndAwaitTermination(ExecutorService executorService) {
// 새로운 스레드가 실행되지 않도록 ExecutorService 를 종료시킵니다.
executorService.shutdown();
try {
// 긴 시간 동안 ExecutorService 가 종료되기를 기다립니다.
if (!executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS)) {
// 시간 초과 후에도 ExecutorService 가 종료되지 않으면 강제로 종료합니다.
executorService.shutdownNow();
}
} catch (InterruptedException e) {
// 대기 중 현재 스레드가 인터럽트되면 강제로 종료합니다.
executorService.shutdownNow();
// 현재 스레드를 다시 인터럽트하여 인터럽트 상태를 복원합니다.
Thread.currentThread().interrupt();
}
}
'Java' 카테고리의 다른 글
OpenSearch를 사용하면서 발생한 문제 (0) | 2023.11.02 |
---|---|
[JAVA] Socket 연결 시 Timeout 설정 (0) | 2023.10.20 |
[JAVA] GenericObjectPool에 대해 알아보고 사용해보자 (0) | 2023.10.17 |
[Java] try-with-resource (AutoCloseable) (0) | 2023.09.25 |
[Java] - Synchronized (0) | 2023.09.22 |