[스레드풀] ExecutorService

____·2024년 10월 24일
0

[SPRING]

목록 보기
4/4
post-thumbnail

비동기스레드를 생성하는 CompletableFuture를 사용하기 위해,
스레드풀 인터페이스를 찾아보려함.


CompletableFuture사용 시, 별다른 스레드풀을 명시하지 않으면,
ForkJoinPool를 사용한다고 한다.

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 라이브러리를 타고들어가면 자세한 설명이 있다.

  1. corePoolSize : 풀안에서 유지하는 스레드 개수
  2. maxiumPoolsize: 가능한 최대 스레드 개수
  3. keepAliveTime : 코어보다 스레드수가 많을때, 작업대기시간. 해당 시간동안 놀게되면 종료됨.
  4. unit (TimeUnit) : keepAliveTime의 단위. ex.Milliseconds.
  5. workQueue (BlockingQueue) : 모든 스레드가 작업 중일때 task를 보관할 큐.

0개의 댓글