자바 가 제공 하 는 네 가지 스 레 드 탱크

6538 단어 Java
간단 한 소개
단독 스 레 드 대신 스 레 드 풀 을 사용 하 는 것 을 추천 합 니 다.많은 요청 을 처리 할 때 모든 요청 이 하나의 스 레 드 를 열 려 면 시스템 은 스 레 드 를 계속 만 들 고 소각 해 야 합 니 다.스 레 드 가 진정 으로 실행 되 는 시간 보다 길 고 시스템 비용 을 증가 해 야 합 니 다.
자바 자체 가 네 가지 스 레 드 탱크 를 제공 하여 일부 기능 을 실현 하 였 다.
스 레 드 탱크
간단 한 해석
newSingleThreadExecutor
하나의 스 레 드 만 작업 하고 있 으 며,다른 작업 은 캐 시 대기 열 에 있 습 니 다.모든 작업 을 단일 스 레 드 직렬 로 수행 하 는 것 과 같 습 니 다.이상 이 끝나 면 새 스 레 드 를 만 듭 니 다.
newFixedThreadPool
고정 크기 의 스 레 드 풀 을 만 들 고 작업 을 제출 할 때마다 스 레 드 를 만 들 고 값 을 설정 할 때 까지 다른 작업 은 캐 시 대기 열 에 넣 습 니 다.이상 이 끝나 면 새 스 레 드 를 만 듭 니 다.
newCachedThreadPool
버퍼 풀,작업 제출 시 스 레 드 를 만 들 고 60s 가 넘 으 면 스 레 드 를 회수 합 니 다.무한 스 레 드.OkHttp 는 이런 방식 으로 보 내 는 요청 을 관리 합 니 다.
newScheduledThreadPool
정기 적 이 고 주기 적 인 작업 을 수행 할 수 있 는 긴 라인 풀 을 만 듭 니 다.
newSingleThreadExecutor
구조 함수:설정 매개 변 수 를 통 해 알 수 있 듯 이 core PoolSize 는 1 만 있 고 캐 시 대기 열 은 무한 대기 열 입 니 다.
    public static ExecutorService newSingleThreadExecutor() {

        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue()));
    }

프로젝트 의 실례 화:
    private static void singleExecutor(){
        ExecutorService executor = Executors.newSingleThreadExecutor();
        execute(executor);
    }

6 개 퀘 스 트 수행 시
작업 1 을 핵심 대기 열 에 추가 하여 실행 하고,기타 2~6 은 캐 시 대기 열 에 넣 습 니 다.
작업 1 이 완료 되면 캐 시 대기 열 에서 2 를 꺼 내 실행 합 니 다.
6 개의 미 션 을 모두 수행 할 때 까지
실행 결 과 는 다음 과 같 습 니 다.
1 is running... 
1 is end !!! 
2 is running... 
2 is end !!! 
3 is running... 
3 is end !!! 
4 is running... 
4 is end !!! 
5 is running... 
5 is end !!! 
6 is running... 
6 is end !!! 

newFixedThreadPool
구조 함수:설정 매개 변 수 를 통 해 알 수 있 듯 이 core PoolSize 는 maximumPooSize 와 크기 가 같 고 캐 시 대기 열 은 무한 대기 열 입 니 다.따라서 핵심 스 레 드 만 존재 합 니 다.설 정 된 작업 개 수 를 초과 하면 캐 시 대기 열 에 넣 고 새로운 스 레 드 를 만 들 지 않 습 니 다.
    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue());
    }

프로젝트 의 실례 화:
    private static void fixedExecutor(){
        ExecutorService executor = Executors.newFixedThreadPool(2);
        execute(executor);
    }

6 개 퀘 스 트 수행 시
작업 1 과 2 는 핵심 스 레 드 에서 실 행 됩 니 다.다른 3~6 은 캐 시 대기 열 에 놓 습 니 다.
작업 1 과 2 를 실행 하고 캐 시 대기 열 에서 3 과 4 를 꺼 내 실행 합 니 다.
작업 3 과 4 가 끝나 면 캐 시 대기 열 에서 5 와 6 을 꺼 내 실행 합 니 다.
 실행 결 과 는 다음 과 같 습 니 다.
1 is running... 
2 is running... 
2 is end !!! 
1 is end !!! 
3 is running... 
4 is running... 
4 is end !!! 
3 is end !!! 
6 is running... 
5 is running... 
5 is end !!! 
6 is end !!! 

newCachedThreadPool
구조 함수:설정 매개 변 수 를 통 해 알 수 있 듯 이 core PoolSize 는 0 이 고 maximumPooSize 는 Integer.MAX 입 니 다.VALUE,핵심 스 레 드 가 없 으 면 작업 이 오 면 스 레 드 를 만 들 고 스 레 드 가 60s 가 넘 으 면 회수 합 니 다.
    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue());
    }

프로젝트 의 인 스 턴 스:
    private static void cacheExecutor(){
        ExecutorService executor = Executors.newCachedThreadPool();
        execute(executor);
    }

6 개 퀘 스 트 수행 시
미 션 1~6 함께 수행
모두 실행 이 끝 난 후,스 레 드 가 60s 를 초과 한 후,스 레 드 회수
실행 결 과 는 다음 과 같 습 니 다.
1 is running... 
3 is running... 
2 is running... 
4 is running... 
5 is running... 
6 is running... 
1 is end !!! 
4 is end !!! 
5 is end !!! 
6 is end !!! 
2 is end !!! 
3 is end !!! 
Process finished with exit code 0

여기 서 몇 마디 더 하 자. Thread PoolExecutor 의 keepAliveTime 이라는 매개 변 수 는 스 레 드 탱크 에서 core PoolSize 수 를 초과 하 는 남 은 스 레 드 의 최대 생존 시간 을 말 합 니 다.즉,핵심 스 레 드 를 제외 하고 만 든 스 레 드 입 니 다.핵심 스 레 드 가 아 닙 니 다.기본 핵심 스 레 드 는 자동 으로 회수 되 지 않 습 니 다.그래서 Thread PoolExecutor 를 사용 할 때 자원 방출 문 제 를 주의 하 세 요.저 는 다음 에 이곳 을 연구 하고 싶 습 니 다.
핵심 스 레 드 가 비어 있 을 때 도 회수 할 수 있다 면 allowCoreThreadTimeOut(true)을 설정 하면 스 레 드 탱크 에서 core 스 레 드 가 keepAlive 에 남 아 있 을 때 도 닫 힙 니 다.
newScheduledThreadPool
구조 함수:설정 매개 변 수 를 통 해 알 수 있 듯 이 corePoolSize 를 설정 한 매개 변수 이 고 maximumPooSize 는 Integer.MAX 입 니 다.VALUE,기본 스 레 드 keep-alive 의 시간 은 10ms 입 니 다.
   public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }

   public ScheduledThreadPoolExecutor(int corePoolSize) {
        super(corePoolSize, Integer.MAX_VALUE,
              DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
              new DelayedWorkQueue());
    }
   private static final long DEFAULT_KEEPALIVE_MILLIS = 10L;

프로젝트 의 실례 화 는 ScheduledExecutorService 와 함께 사용 해 야 합 니 다.
    private static void scheduledExecutor(){
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
        executor.scheduleAtFixedRate(new NameRunnable(1),1L,3L, TimeUnit.SECONDS);
        executor.scheduleAtFixedRate(new NameRunnable(2),1L,3L, TimeUnit.SECONDS);
        executor.scheduleAtFixedRate(new NameRunnable(3),1L,3L, TimeUnit.SECONDS);
        executor.scheduleAtFixedRate(new NameRunnable(4),1L,3L, TimeUnit.SECONDS);
        executor.scheduleAtFixedRate(new NameRunnable(5),1L,3L, TimeUnit.SECONDS);
        executor.scheduleAtFixedRate(new NameRunnable(6),1L,3L, TimeUnit.SECONDS);
    }

6 개 퀘 스 트 수행 시:
시작 하면 작업 1 과 2(설 정 된 core Size 는 2)를 실행 하고 나머지 3~6 은 캐 시 대기 열 에 추가 합 니 다.
1 과 2 를 실행 한 후 대열 에서 3 과 4 를 취하 여 순서대로 유추 하 다.
5 와 6 이 실 행 된 후에 다시 1 과 2 부터 실 행 됩 니 다.
실행 결 과 는 다음 과 같 습 니 다.
2 is running... 
1 is running... 
1 is end !!! 
2 is end !!! 
3 is running... 
4 is running... 
3 is end !!! 
4 is end !!! 
5 is running... 
6 is running... 
5 is end !!! 
6 is end !!! 
1 is running... 
2 is running... 
2 is end !!! 
1 is end !!! 
3 is running... 
4 is running... 
4 is end !!! 
3 is end !!! 
5 is running... 
6 is running... 
 


종결 어
실제 프로젝트 에 서 는 스스로 new 를 통과 하 는 것 을 권장 합 니 다. Thread PoolExecutor 의 구조 방법 을 설정 하여 스 레 드 를 만 들 면 스 레 드 탱크 의 운행 규칙 을 더욱 명확 하 게 하고 자원 이 소모 되 지 않도록 하 며 위험 이 적 습 니 다.

좋은 웹페이지 즐겨찾기