Java ThreadPoolExecutor 클래스 매개 변수 설명

자바 ThreadPoolExecutor

@ 저자 : Jingdai
@date : 2020.11.03

최근에 책에 자주 나오는 "Java Concurrent Programming Practical Combat"라는 책을 읽었는데이 ThreadPoolExecutor수업에 익숙하지 않아서 공부하고 간략하게 요약했습니다.

기본 컨셉

ThreadPoolExecutor이 클래스는 스레드 풀입니다. "자바 코어 기술, 제 1 권",이 책 이전에 소개 Executors될 수있는 스레드 풀 클래스 정적 메서드, Executors.newCachedThreadPool()메서드, 사실, 그것은 본질적으로 ThreadPoolExecutor생성자를 호출 하는 것입니다 스레드 풀 예, 나중에 소개됩니다. 그러나 Alibaba Java 개발 매뉴얼을 읽으면 Executors그림과 같이 클래스를 사용하여 스레드 풀을 만들 수 없습니다 .

여기에 사진 설명 삽입

따라서 ThreadPoolExecutor수업 사용에 대해 배우는 것이 매우 필요합니다 .

생성자 매개 변수

ThreadPoolExecutor클래스에는 스레드 풀을 만드는 4 개의 생성자가 있습니다. 다음과 같습니다.

  • ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue)
  • ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit 단위, BlockingQueue workQueue, RejectedExecutionHandler 핸들러)
  • ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue workQueue, ThreadFactory threadFactory)
  • ThreadPoolExecutor (int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit 단위, BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler 핸들러)

이제 각각의 매개 변수를 간략히 소개 처음 소개 corePoolSize, maximumPoolSize그리고 workQueue그들이 상호대로, 세 개의 매개 변수를.

corePoolSize : 스레드 풀의 코어 스레드 수

maximumPoolSize : 스레드 풀의 최대 스레드 수

workQueue : 스레드 풀에서 사용하는 블로킹 큐, 여기서 주로 길이와 관련이 있습니다.

첫째 가정 corePoolSize, maximumPoolSizeworkQueue길이는 0보다 큰 정수이다. 다음 task과 같이 네 가지 경우에 새 작업 이 도착합니다.

여기에 사진 설명 삽입

  1. 스레드 풀의 스레드 수가 < corePoolSize이면 새 코어 스레드가 생성되고 작업이 실행되도록 넘겨집니다.
  2. 스레드 풀의 스레드 수> = corePoolSize이고 블로킹 큐 workQueue가 가득 차지 않은 경우 새 태스크는 대기 할 블로킹 큐에 배치됩니다.
  3. 스레드 풀 corePoolSize의 스레드 수 > = 및 스레드 풀 스레드 수 < maximumPoolSize블로킹 큐 workQueue가 가득 차면 새로운 비 코어 스레드가 생성되어 자신에게 맡겨진 작업을 수행합니다.
  4. 쓰레드 풀 쓰레드 개수 = maximumPoolSize블로킹 큐 workQueue가 꽉 찼을 때 작업이 거부되고 거부 된 특정 처리는 추후 소개 될 예정입니다.

참고 : workQueue대기열이 무한 할 때 차단 대기열이 설정 되면 (예 : 미리 정의 된 볼륨 LinkedBlockingQueue가 없음) maximumPoolSize소용이 없습니다. 종료되면 corePoolSize작업이 항상 차단 대기열에 추가되고 차단 대기열이 가득 차 있지 않으면 코어가 아닌 스레드를 만들지 않습니다.

keepAliveTime : 스레드 유지 시간

unit : 스레드가 살아있는 시간 단위

스레드 풀의 스레드 수가을 초과 corePoolSize하면 초과 스레드 유휴 시간이 위 매개 변수에서 설정 한 시간을 초과하면 해당 스레드가 소멸됩니다. 기본적으로 풀의 스레드 수가 corePoolSize시간이 지남에 따라 구현 되는 경우에만 이 전략이 구현되지만 allowCoreThreadTimeOut(boolean)정책 방법에 대해 설정할 있으며 코어 스레드도 적용됩니다.

handler : 태스크 프로세서 거부

스레드 풀이 닫히거나 스레드 풀의 용량이 꽉 찼을 때 ( workQueue찼고 풀 maximumPoolSize스레드 수가 ) 작업을 스레드 풀에 제출하면 작업 프로세서 작업이 거부됩니다. 4 개의 미리 정의 된 거부 처리기가 있습니다.

  1. ThreadPoolExecutor.AbortPolicy: 기본 거부 프로세서, 작업 RejectedExecutionException예외 발생시 throw를 거부합니다 .
  2. ThreadPoolExecutor.CallerRunsPolicy: 태스크를 제출하는 스레드가 제출 된 태스크를 자체적으로 실행하도록합니다. 예를 들어, 메인 스레드가 스레드 풀에 작업을 제출하고 스레드 풀에서 거부하면 메인 스레드는 자체적으로 작업을 실행합니다.
  3. ThreadPoolExecutor.DiscardPolicy : 실행할 수없는 작업을 직접 삭제합니다.
  4. ThreadPoolExecutor.DiscardOldestPolicy: 스레드 풀이 닫히지 않은 경우 차단 대기열 스레드 풀 workQueue은 첫 번째 작업을 버리고 다시 수행합니다.

기타 관련 방법

위는 생성자의 관련 파라미터에 대한 설명과 동시에 스레드 풀이 생성 된 후 관련 파라미터도 변경할 수 있습니다.

  • getCorePoolSize()setCorePoolSize(int corePoolSize)

    이름에서 알 수 있듯이 스레드 풀의 코어 스레드 수를보고 수정할 수 있습니다.

  • getMaximumPoolSize()setMaximumPoolSize(int maximumPoolSize)

    스레드 풀의 최대 스레드 수보기 및 수정

  • setKeepAliveTime(long time, TimeUnit unit)

    스레드가 비활성 상태 인 경우 삭제되는 시간 설정

다른

Executors본질적으로 스레드 풀을 만드는 위에서 언급 한 정적 메서드 ThreadPoolExecutor는 생성자에 대한 호출이기도합니다 . jdk8의 소스 코드를 살펴보십시오.

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>());
}

여기에서 본질이 동일하다는 것을 알 수 있으므로이 구성 방법을 통해 스레드 풀을 생성하면 스레드 풀의 다양한 매개 변수를보다 명확하게 알 수 있습니다.

참고

  • 자바 8 API

추천

출처blog.csdn.net/qq_41512783/article/details/109473365