자바 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
,maximumPoolSize
및workQueue
길이는 0보다 큰 정수이다. 다음task
과 같이 네 가지 경우에 새 작업 이 도착합니다.
- 스레드 풀의 스레드 수가 <
corePoolSize
이면 새 코어 스레드가 생성되고 작업이 실행되도록 넘겨집니다.- 스레드 풀의 스레드 수> =
corePoolSize
이고 블로킹 큐workQueue
가 가득 차지 않은 경우 새 태스크는 대기 할 블로킹 큐에 배치됩니다.- 스레드 풀
corePoolSize
의 스레드 수 > = 및 스레드 풀 스레드 수 <maximumPoolSize
블로킹 큐workQueue
가 가득 차면 새로운 비 코어 스레드가 생성되어 자신에게 맡겨진 작업을 수행합니다.- 쓰레드 풀 쓰레드 개수 =
maximumPoolSize
블로킹 큐workQueue
가 꽉 찼을 때 작업이 거부되고 거부 된 특정 처리는 추후 소개 될 예정입니다.참고 :
workQueue
대기열이 무한 할 때 차단 대기열이 설정 되면 (예 : 미리 정의 된 볼륨 LinkedBlockingQueue가 없음)maximumPoolSize
소용이 없습니다. 종료되면corePoolSize
작업이 항상 차단 대기열에 추가되고 차단 대기열이 가득 차 있지 않으면 코어가 아닌 스레드를 만들지 않습니다.
keepAliveTime
: 스레드 유지 시간
unit
: 스레드가 살아있는 시간 단위스레드 풀의 스레드 수가을 초과
corePoolSize
하면 초과 스레드 유휴 시간이 위 매개 변수에서 설정 한 시간을 초과하면 해당 스레드가 소멸됩니다. 기본적으로 풀의 스레드 수가corePoolSize
시간이 지남에 따라 구현 되는 경우에만 이 전략이 구현되지만allowCoreThreadTimeOut(boolean)
정책 방법에 대해 설정할 수 있으며 코어 스레드도 적용됩니다.
handler
: 태스크 프로세서 거부스레드 풀이 닫히거나 스레드 풀의 용량이 꽉 찼을 때 (
workQueue
꽉 찼고 풀 의maximumPoolSize
스레드 수가 ) 작업을 스레드 풀에 제출하면 작업 프로세서 작업이 거부됩니다. 4 개의 미리 정의 된 거부 처리기가 있습니다.
ThreadPoolExecutor.AbortPolicy
: 기본 거부 프로세서, 작업RejectedExecutionException
예외 발생시 throw를 거부합니다 .ThreadPoolExecutor.CallerRunsPolicy
: 태스크를 제출하는 스레드가 제출 된 태스크를 자체적으로 실행하도록합니다. 예를 들어, 메인 스레드가 스레드 풀에 작업을 제출하고 스레드 풀에서 거부하면 메인 스레드는 자체적으로 작업을 실행합니다.ThreadPoolExecutor.DiscardPolicy
: 실행할 수없는 작업을 직접 삭제합니다.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