자바 병렬 프로 그래 밍 시리즈:Thread PoolExecutor 의 일 들
ThreadPoolExecutor
:하나의 스 레 드 탱크 Executors
:스 레 드 탱크 공장 은 이 를 통 해 특정한 기능 을 가 진 스 레 드 탱크 ThreadPoolExecutor
류 를 얻 을 수 있 기 때문에 Executor
인 터 페 이 스 를 통 해 모든 Runnable
대상 은 ThreadPoolExecutor
스 레 드 탱크 에 의 해 조 정 될 수 있다.일반적인 스 레 드 탱크 유형public static ExecutorService newFixedThreadPool(int nThreads)
은 고정 스 레 드 수량의 스 레 드 풀 을 되 돌려 줍 니 다.스 레 드 수량 이 변 하지 않 습 니 다.남 은 스 레 드 가 있 을 때 즉시 실행 합 니 다.없 으 면 새 스 레 드 는 작업 대기 열 에 잠시 저장 되 고 스 레 드 가 비어 있 으 면 작업 대기 열 에 있 는 작업 을 처리 합 니 다.public static ExecutorService newSingleThreadExecutor()
은 하나의 스 레 드 만 있 는 스 레 드 풀 로 돌아 갑 니 다.새 스 레 드 가 작업 대기 열 에 저장 되 어 있 습 니 다.스 레 드 가 비어 있 을 때 작업 대기 열 에 있 는 작업 을 처리 합 니 다.public static ExecutorService newCachedThreadPool()
은 실제 상황 에 따라 스 레 드 수량 을 조정 할 수 있 는 스 레 드 탱크 로 돌아 갑 니 다.스 레 드 의 프로 세 스 수 는 확실 하지 않 지만 남 은 스 레 드 가 있 으 면 이 스 레 드 를 우선 사용 합 니 다.모든 스 레 드 가 작 동 하고 새로운 작업 이 제출 되면 새로운 스 레 드 를 만들어 작업 을 수행 합 니 다.모든 스 레 드 는 현재 작업 이 완료 되면 스 레 드 탱크 로 돌아 가 복용 합 니 다.public static ScheduledExecutorService newSingleThreadScheduldExecutor()
은 ScheduledExecutorService
대상 을 되 돌려 주 고 스 레 드 탱크 의 크기 는 1 이다.특정한 고정된 지연 후에 집행 하거나 주기 적 으로 특정한 임 무 를 수행 하 는 public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
은 위 와 같 지만 스 레 드 수 를 지정 할 수 있 습 니 다.핵심 스 레 드 탱크 의 내부 실현
핵심 적 인 몇 개의 스 레 드 탱크 에 대해 그 내부 실현 은 모두
ThreadPoolExecutor
을 사용 하여 이 루어 졌 다.public static ExecutorService newFixedThreaPool(int nThreads) {
return new ThreadPoolExecutor(nThreads,nThreads,
0L,TimeUnit.SECONDS,
new LinkedBlockingQueue());
}
public static ExecutorService newSingleThreadExecutor() {
return new ThreadPoolExecutor(1,1,
0L,TimeUnit.SECONDS,
new LinkedBlockingQueue());
}
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0,Integer.MAX_VALUE,
60L,TimeUnit.SECONDS,
new SynchronousQueue());
}
ThreadPoolExecutor
의 가장 중요 한 구조 함 수 를 보 세 요.public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long KeepAliveTime,
TimeUnit unit,
BlockingQueue workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
함수 의 매개 변 수 는 다음 과 같다.
corePoolSize
:스 레 드 탱크 의 스 레 드 수량.maximumPoolSize
:스 레 드 탱크 의 최대 스 레 드 수량.keepAliveTime
:스 레 드 탱크 의 수량 이 corePoolSize
을 초과 할 때 남 은 스 레 드 의 생존 시간.unit
:keepAliveTime
의 단위.workQueue
:퀘 스 트 대기 열,제출 되 었 으 나 실행 되 지 않 은 퀘 스 트 입 니 다.threadFactory
:스 레 드 공장 은 스 레 드 를 만 드 는 데 사용 되 며 보통 기본 값 으로 사용 하면 됩 니 다.handler
:거부 전략.임무 가 너무 많아 서 처리 할 시간 이 없 을 때,어떻게 임 무 를 거절 합 니까?위의 매개 변수 에서 다른 것 은 모두 이해 하기 쉬 우 며 주로
workQueue
과 handler
에 중심 을 두 고 언급 해 야 한다.workQueue
퀘 스 트 대열 설명workQueue
은 제출 되 었 으 나 실행 되 지 않 은 작업 대기 열 을 말 합 니 다.BlockingQueue
인터페이스 의 대상 으로 Runnable
대상 만 존재 합 니 다.대기 열 기능 에 따라 ThreadPoolExecutor
의 구조 함수 에서 다음 과 같은 몇 가지 BlockingQueue
을 사용 할 수 있 습 니 다.SynchronousQueue
:SychronousQueue
은 특수 한 BlockingQueue
이다.SychronousQueue
은 용량 이 없 기 때문에 모든 삽입 작업 은 해당 하 는 삭제 작업 을 기 다 려 야 한다.반면에 하나의 삭제 작업 은 해당 하 는 삽입 작업 을 기 다 려 야 한다.SychronousQueue
을 사용 하면 제출 한 작업 이 실제 저장 되 지 않 고 항상 새 작업 을 스 레 드 에 제출 합 니 다.남 은 스 레 드 가 없 으 면 새로운 스 레 드 를 만 들 려 고 합 니 다.프로 세 스 수가 최대 치 에 이 르 렀 다 면 거부 정책 을 실행 합 니 다.따라서 SychronousQueue
을 사용 하려 면 보통 maximumcorePoolSize
을 크게 설정 해 야 한다.그렇지 않 으 면 거부 전략 을 실행 하기 쉽다.ArrayBlockingQueue
:특징:새로운 작업 을 수행 해 야 할 경우 스 레 드 탱크 의 실제 스 레 드 가 corePoolSize
보다 적 으 면 새로운 스 레 드 를 우선 만 듭 니 다.corePoolSize
이상 이면 새 작업 을 대기 열 에 추가 합 니 다.대기 열 이 가득 차 서 가입 할 수 없 으 면 버스 가 maximumPoolSize
보다 성숙 하지 않 은 전제 에서 새로운 스 레 드 를 만들어 작업 을 수행 합 니 다.크 면 거부 정책 을 실행 합 니 다.LinkedBlockingQueue
:특징:새로운 퀘 스 트 를 수행 해 야 할 경우 스 레 드 탱크 의 실제 스 레 드 가 corePoolSize
보다 작 으 면 새로운 스 레 드 를 우선 만 듭 니 다.corePoolSize
이상 이면 대기 열 에 들 어 갑 니 다.PriorityBlockingQueue
:퀘 스 트 자체 의 우선 순위 순서에 따라 선후 로 수행 할 수 있 습 니 다.handler
거부 전략 설명JKD
내 장 된 거부 전략 은 모두 RejectedExecutionHandler
인 터 페 이 스 를 실현 함으로써 이 루어 진 것 으로 구체 적 으로 다음 과 같다.AbortPolicy
전략:이상 을 직접 던 져 시스템 의 정상 적 인 작업 을 막는다.CallerRunsPolicy
정책:스 레 드 가 닫 히 지 않 으 면 호출 자 스 레 드 에서 현재 버 려 진 작업 을 실행 합 니 다.warning:성능 이 급 격 히 떨 어 질 수 있 습 니 다.DiscardOledstPolicy
전략:가장 오래된 요청 을 버 리 고 현재 작업 을 다시 제출 하려 고 합 니 다.DiscardPolicy
전략:처리 할 수 없 는 요 구 를 버 리 고 어떠한 처리 도 하지 않 으 며 어떠한 제시 도 하지 않 습 니 다.이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java. util. concurrent 패키지 의 해체@Date 2019-7-8 11:25*/public class BlockingQueueExample {public static void main(String[] args) {BlockingQueue blockingQ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.