자바 스 레 드 풀 분석

6810 단어 Java
자바 에 서 는 스 레 드 탱크 의 활용 장면 이 매우 많 고 비동기 또는 병행 작업 이 필요 한 모든 프로그램 이 스 레 드 탱크 를 사용 할 수 있 습 니 다.
목차
스 레 드 탱크 의 장점
스 레 드 탱크 의 작업 절차
스 레 드 탱크 의 구성 요소
스 레 드 탱크 에 작업 제출
스 레 드 풀 닫 기
자바 자체 스 레 드 탱크
스 레 드 탱크 의 장점
  • 자원 소 모 를 줄인다.만 든 스 레 드 를 반복 적 으로 이용 하여 스 레 드 를 만 들 고 스 레 드 를 없 애 는 자원 소 모 를 줄 였 습 니 다
  • .
  • 응답 속 도 를 높 였 다.작업 이 있 을 때 작업 은 스 레 드 생 성 을 기다 리 지 않 고 수행 할 수 있 습 니 다
  • 스 레 드 의 관리 성 을 향상 시 켰 다.

  • 스 레 드 탱크 의 작업 절차
    스 레 드 탱크 에 작업 을 제출 한 후에 스 레 드 탱크 는 핵심 스 레 드 탱크 의 스 레 드 가 모두 작업 을 수행 하고 있 는 지 판단 합 니 다. 그렇지 않 으 면 새로운 스 레 드 를 만들어 이 작업 을 수행 합 니 다.핵심 스 레 드 가 작업 을 수행 하고 있 으 면 작업 대기 열 이 가득 찼 는 지 판단 하고, 가득 차지 않 으 면 작업 대기 열 에 작업 을 저장 합 니 다.작업 대기 열 이 가득 차 면 스 레 드 탱크 의 스 레 드 가 가득 차 있 는 지, 가득 차 면 포화 거부 정책 을 실행 하고, 가득 차 지 않 으 면 새로운 스 레 드 를 만들어 작업 을 수행 합 니 다.
    스 레 드 탱크 의 구성 요소
    ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime, TimeUnit unit,BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)

    스 레 드 풀 을 만 들 려 면 위의 매개 변수 가 필요 합 니 다.
    코어 풀 사이즈: 핵심 스 레 드 탱크 의 크기 도 스 레 드 탱크 의 기본 크기 로 이해 할 수 있 습 니 다. 스 레 드 탱크 에 작업 을 제출 할 때 스 레 드 탱크 는 스 레 드 를 만들어 작업 을 수행 합 니 다. 다른 남 은 핵심 스 레 드 가 작업 을 수행 할 수 있 더 라 도 새로운 핵심 스 레 드 를 만들어 서 수행 합 니 다.예열 이 완료 되면 실행 해 야 할 작업 수가 스 레 드 탱크 의 기본 크기 보다 많 을 때 다시 만 들 지 않 습 니 다.
    maximumPoolSize: 스 레 드 탱크 에서 만 들 수 있 는 최대 스 레 드 수 입 니 다. 작업 대기 열 이 가득 차고 최대 스 레 드 수 보다 적 으 면 스 레 드 탱크 는 새로운 스 레 드 를 만 들 고 작업 을 수행 합 니 다. 작업 대기 열 이 무한 (LinkedBlockingQueue) 이 라면 이 매개 변 수 는 실제 효과 가 없습니다.
    keepAlive Time: 스 레 드 탱크 의 작업 스 레 드 가 비어 있 으 면 생존 시간 을 유지 합 니 다. 작업 이 많 고 모든 작업 의 수행 시간 이 짧 을 때 시간 을 늘 려 스 레 드 의 이 용 률 을 높 일 수 있 습 니 다.
    TimeUnit :스 레 드 생존 시간의 단위.
    workQueue: 작업 대기 열, 실행 을 기다 리 는 작업 의 차단 대기 열 을 저장 합 니 다.
  • Array BlockingQueue: 이것 은 배열 구 조 를 바탕 으로 하 는 경계 차단 대기 열 로 FIFO 방식 으로 요 소 를 정렬 합 니 다.
  • 링크 드 BlockingQueue: 이것 은 링크 구 조 를 바탕 으로 하 는 차단 대기 열 로 경계 가 없습니다.
  • SynchronousQueue: 이것 은 요 소 를 저장 하지 않 는 차단 대기 열 입 니 다. 한 그릇 을 씻 을 때마다 말 리 는 것 과 같 습 니 다. 씻 은 후에 찬장 에 올 려 놓 고 말리 지 않 습 니 다
  • Priority BlockingQueue: 우선 순위 가 있 는 무한 차단 대기 열 입 니 다.

  • ThreadFactory :스 레 드 를 만 드 는 공장 을 설정 하면 스 레 드 공장 을 통 해 만 든 스 레 드 마다 이름 을 설정 할 수 있 습 니 다.
    Rejected Execution Handler: 포화 거부 정책 입 니 다. 대기 열 과 스 레 드 탱크 가 가득 차 면 스 레 드 탱크 가 포화 상태 에 있 음 을 설명 합 니 다. 제출 한 새로운 작업 을 처리 하기 위해 서 는 하나의 전략 을 사용 해 야 합 니 다.일반적으로 기본 값 은 AbortPolicy 입 니 다.
  • AbortPolicy: 이상 을 직접 던 집 니 다.
  • CallerRunsPolicy: 호출 자가 있 는 스 레 드 로 만 작업 을 수행 합 니 다.
  • DiscardOldestPolicy: 대기 열 에서 가장 오래된 작업 을 버 리 고 현재 작업 을 수행 합 니 다.
  • Discard Policy: 처리 하지 않 고 바로 버 립 니 다. 

  • 스 레 드 탱크 에 작업 제출
    스 레 드 탱크 에 작업 을 제출 하 는 데 는 execute () 와 submit () 두 가지 방법 이 있 습 니 다.
    execute () 방법 은 반환 값 이 없 는 작업 을 제출 하 는 데 사용 되 기 때문에 이 작업 이 스 레 드 풀 에 의 해 성공 되 었 는 지 판단 할 수 없습니다.
    submit () 방법 은 반환 값 이 있 는 작업 을 제출 하 는 데 사 용 됩 니 다. 스 레 드 풀 은 future 형식의 대상 을 되 돌려 줍 니 다.이 대상 으로 임무 수행 의 성공 여 부 를 판단 할 수 있다.future 의 get () 방법 을 통 해 되 돌아 오 는 값 을 얻 을 수 있 습 니 다.
    스 레 드 풀 닫 기
    스 레 드 풀 을 닫 는 방법 은 두 가지 가 있 습 니 다. shutdown () 과 shutdown Now () 는 스 레 드 풀 을 닫 습 니 다.스 레 드 탱크 의 작업 스 레 드 를 옮 겨 다 니 며 스 레 드 의 interrupt () 방법 으로 스 레 드 를 중단 하기 때문에 중 단 된 스 레 드 에 응답 하지 못 하면 종료 할 수 없습니다.shutdown Now 는 스 레 드 탱크 의 상 태 를 STOP 로 설정 한 다음 에 실행 중인 스 레 드 나 일시 정지 중인 모든 스 레 드 를 중단 하고 작업 을 기다 리 는 목록 으로 돌아 가 려 고 합 니 다.shutdown 은 스 레 드 탱크 의 상 태 를 SHUTDOWN 상태 로 설정 한 다음 실행 중인 스 레 드 가 없 는 모든 스 레 드 를 중단 합 니 다.
    자바 자체 스 레 드 탱크
    자바 에서 추천 하 는 4 가지 스 레 드 풀 은 Fixed ThreadPool, Single ThreadExecutor, Cached ThreadPool, Scheduled ThreadPoolExecutor 입 니 다.
  • Fixed ThreadPool 은 고정 스 레 드 수 를 다시 사용 할 수 있 는 스 레 드 풀 이 라 고 합 니 다. core PoolSize 와 maximum PoolSize 는 스 레 드 풀 을 만 들 때 지정 한 매개 변수 nThreads 로 설정 되 어 있 습 니 다. 스 레 드 풀 의 스 레 드 수가 core PoolSize 보다 많 을 때 keepAliveTime 은 0 으로 설정 되 어 있 습 니 다. 남 은 스 레 드 가 금지 되 어 있 음 을 의미 합 니 다.

  • 실행 과정: 현재 실행 루틴 수
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue());
    }

    스 레 드 탱크 의 스 레 드 수가 core PoolSize 에 이 르 렀 을 때 새로운 작업 은 무 계 대기 열 에서 기다 리 기 때문에 스 레 드 탱크 의 스 레 드 수 는 core PoolSize 를 초과 하지 않 습 니 다.이 작업 대기 열 은 무한 대기 열 이기 때문에 maximum PoolSize 와 keepAliveTime 은 무효 화 되 며, 실행 중인 Fixed ThreadPool 은 shutdown () 과 shutdown Now () 를 호출 하지 않 을 때 작업 을 거부 하지 않 습 니 다.
  • Single ThreadExecutor 는 하나의 작업 스 레 드 를 사용 하 는 Executor 입 니 다. core PoolSize 와 maximum PoolSize 는 모두 1 로 설정 되 어 있 으 며 링크 드 BlockingQueue 를 작업 대기 열 로 사용 합 니 다.

  • 실행 과정: 현재 실행 중인 스 레 드 의 수량 이
     
    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue()));
    }
    
  •  CachedThreadPool 은 필요 에 따라 새 스 레 드 를 만 드 는 스 레 드 풀 입 니 다. corePoolSize 는 0 으로 설정 되 어 있 고 maximumPoolSize 는 Integer. MAX 로 설정 되 어 있 습 니 다.VALUE 는 maximumPool 이 무한 하 다 고 이해 할 수 있 습 니 다. 작업 대기 열 은 용량 이 없 는 SynchronousQueue 입 니 다. 이 는 메 인 스 레 드 가 작업 을 제출 하 는 속도 가 maximumPool 의 스 레 드 처리 속도 보다 높 을 때 새로운 스 레 드 를 계속 만 듭 니 다. 극단 적 인 상황 에서 너무 많은 스 레 드 를 만 들 었 기 때문에 CPU 자원 을 소모 합 니 다
  • .
    실행 과정: 우선 SynchronousQueue. offer (Runnable task) 를 실행 합 니 다. 현재 maximumPool 에 남 은 스 레 드 가 SynchronousQueue. poll 방법 을 실행 하고 있다 면 메 인 스 레 드 가 실 행 된 offer 작업 과 남 은 스 레 드 의 poll 작업 이 성공 하면 메 인 스 레 드 는 빈 스 레 드 에 임 무 를 맡 깁 니 다. maximumPool 이 비어 있 거나 현재 빈 스 레 드 가 없 을 때.CachedThreadPool 은 새 스 레 드 를 만 들 고 작업 을 수행 합 니 다. 이 새 스 레 드 가 생 성 되면 SynchronousQueue. poll 방법 을 실행 합 니 다. 이 poll 작업 은 빈 스 레 드 로 주 스 레 드 의 offer 작업 을 기다 리 게 합 니 다. 60s 내 에 주 스 레 드 가 offer 작업 을 하면 짝 짓 기 에 성공 합 니 다. 주지 않 으 면 이 빈 스 레 드 는 종 료 됩 니 다.
    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue());
    }
  • Scheduled Thread PoolExecutor 는 주어진 지연 후에 작업 을 실행 하거나 정기 적 으로 작업 을 수행 하 는 데 사 용 됩 니 다.이것 은 앞의 세 개의 스 레 드 탱크 와 다 릅 니 다. 앞의 세 개의 스 레 드 탱크 는 ThreadPoolExecutor 공장 클래스 를 통 해 만 들 어 졌 습 니 다. Scheduled ThreadPoolExecutor 는 Executor 공장 클래스 를 통 해 만 들 어 졌 습 니 다. 여러 개의 배경 스 레 드 를 통 해 주기 적 인 작업 을 수행 하 는 데 적 용 됩 니 다. 그 안의 대기 열 은 Delay Queue 이 고 Delay Queue 는 우선 순위 대기 열 에 의 해 이 루어 진 무한 차단 대기 열 입 니 다.작업 대기 열 이 무질서 하기 때문에 maximumPoolSize 값 이 잘못 되 었 습 니 다.

  • 실행 과정: Delay Queue 에서 만 료 된 Scheduled Future Task 를 가 져 오고 이 작업 을 수행 한 후 이 작업 의 time 을 다음 실행 시간 으로 바 꾸 고 Delay Queue 에 다시 놓 습 니 다.

    좋은 웹페이지 즐겨찾기