자바 병렬 프로 그래 밍 시리즈:Thread PoolExecutor 의 일 들

5658 단어 병발 하 다자바
스 레 드 탱크 기초 지식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:거부 전략.임무 가 너무 많아 서 처리 할 시간 이 없 을 때,어떻게 임 무 를 거절 합 니까?

  • 위의 매개 변수 에서 다른 것 은 모두 이해 하기 쉬 우 며 주로 workQueuehandler 에 중심 을 두 고 언급 해 야 한다.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 전략:처리 할 수 없 는 요 구 를 버 리 고 어떠한 처리 도 하지 않 으 며 어떠한 제시 도 하지 않 습 니 다.
  • 좋은 웹페이지 즐겨찾기