비동기스레드를 생성하는 CompletableFuture를 사용하기 위해,
스레드풀 인터페이스를 찾아보려함.
CompletableFuture사용 시, 별다른 스레드풀을 명시하지 않으면,
ForkJoinPool를 사용한다고 한다.
- Task를 fork를 통해서 Subtask로 나누고 하나의 스레드에서 모든 것을 처| 리하지 않고 sub로 나눈다.
- Thread pool에서 steal work 알고리즘을 이용해서 균등하게 처리해서
- join을 통해 결과를 생성
그림으로 보면 다음과 같음
public class Executors {
// 단일 쓰레드로 구성된 스레드 풀을 생성. 한번에 하나의 작업만 실행
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory));
}
// 고정된 크기의 쓰레드풀을 생성
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
// 사용 가능한 쓰레드가 없다면 새로 생성해서 작업을 처리하고, 있다면 재사용. 쓰레드가 일정 시간 사용되지 않으면 회수
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
// 스케줄링 기능을 갖춘 고정 크기의 쓰레드 풀을 생성. 주기적이거나 지연이 발생하는 작업을 실행
public static ScheduledExecutorService newScheduledThreadPool(
int corePoolSize, ThreadFactory threadFactory) {
return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
}
// work steal 알고리즘을 사용하는 ForkJoinPool을 생성
public static ExecutorService newWorkStealingPool(int parallelism) {
return new ForkJoinPool
(parallelism,
ForkJoinPool.defaultForkJoinWorkerThreadFactory,
null, true);
}
}
스레드풀을 어떻게 하면 적합하게 설정을 해줄 수 있는지가 궁금해서 스레드풀executor를 더 알아보고 싶었음.
ThreadPoolExecutor 라이브러리를 타고들어가면 자세한 설명이 있다.