java ~ 스 레 드 탱크 의 총 결

4408 단어
스 레 드 의 생 성과 효율 은 프로세서 (cpu) 의 자원 을 소모 해 야 하기 때문에 우 리 는 스 레 드 를 사용 할 때 주의해 야 합 니 다. 당신 의 모든 동작 은 그것 을 위해 계산 해 야 합 니 다. 즉, 스 레 드 의 사용 은 신중 해 야 하기 때문에 자바 는 스 레 드 관리 도 봉쇄 했 습 니 다. 바로 오늘 말 할 스 레 드 풀 입 니 다.현재 자바 는 주로 4 가지 유형의 스 레 드 탱크 를 봉 인 했 습 니 다. 다음은 간단하게 소개 하 겠 습 니 다.
4 대 유형의 스 레 드 탱크
  • new CachedThreadPool 은 캐 시 가능 한 스 레 드 풀 을 만 듭 니 다. 스 레 드 풀 의 길이 가 처리 수 요 를 초과 하면 남 은 스 레 드 를 유연 하 게 회수 할 수 있 습 니 다. 회수 할 수 없 으 면 새 스 레 드 를 만 듭 니 다.
  • new Fixed ThreadPool 은 스 레 드 의 최대 병발 수 를 제어 할 수 있 고 초과 한 스 레 드 는 대기 열 에서 기다 릴 수 있 습 니 다.
  • new Scheduled ThreadPool 은 정기 적 이 고 주기 적 인 작업 수행 을 지원 합 니 다.
  • new Single ThreadExecutor 는 단일 라인 스 레 드 풀 을 만 듭 니 다. 유일한 작업 스 레 드 로 만 작업 을 수행 하고 모든 작업 이 지 정 된 순서 (FIFO, LIFO, 우선 순위) 에 따라 실 행 될 수 있 도록 합 니 다.

  • 스 레 드 탱크 의 주요 세 가지 매개 변수
    core PoolSize: 스 레 드 탱크 의 기본 크기, 즉 작업 이 수행 되 지 않 을 때 스 레 드 탱크 의 크기, 그리고 작업 대기 열 이 가득 찬 상태 에서 만 이 수량 을 초과 하 는 스 레 드 를 만 들 수 있 습 니 다.여기 서 주의해 야 할 것 은 Thread PoolExecutor 를 만 들 었 을 때 스 레 드 가 바로 시작 되 지 않 고 작업 이 제출 될 때 까지 기 다 려 야 시작 합 니 다. prestartCoreThread / restartAllCoreThreads 가 핵심 스 레 드 를 미리 시작 하지 않 는 한.또한 keepAliveTime 과 allowCoreThreadTimeOut 시간 초과 매개 변수 의 영향 을 고려 하여 작업 을 수행 해 야 할 때 스 레 드 탱크 의 크기 가 반드시 core PoolSize 가 아 닙 니 다.maximumPoolSize: 스 레 드 탱크 에서 허용 하 는 최대 스 레 드 수, 스 레 드 탱크 의 현재 스 레 드 수 는 이 값 을 초과 하지 않 습 니 다.대기 열 에 작업 이 가득 차 있 고 현재 스 레 드 개수 가 maximumPoolSize 보다 작 으 면 새 스 레 드 를 만들어 작업 을 수행 합 니 다.여기 서 언급 할 만 한 것 은 largest PoolSize 입 니 다. 이 변 수 는 스 레 드 탱크 가 전체 수명 주기 에 나타 난 최대 스 레 드 개 수 를 기록 합 니 다.왜 옛날 이 라 고 하 죠?스 레 드 탱크 가 생 성 되면 setMaximumPoolSize () 를 호출 하여 실행 중인 최대 스 레 드 의 수 를 변경 할 수 있 기 때 문 입 니 다.poolSize: 스 레 드 탱크 의 현재 스 레 드 수량 은 이 값 이 0 일 때 스 레 드 가 없 으 면 스 레 드 탱크 가 종 료 됩 니 다.같은 시각 에 poolSize 는 maximum PoolSize 를 초과 하지 않 습 니 다.
    관련 인 스 턴 스 코드
    newCachedThreadPool 캐 시 풀
     /**
       * newCachedThreadPool      ,      .
       */
      @Test
      public void newCachedThreadPool() {
        ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
        for (int i = 0; i < 20; i++) {
          cachedThreadPool.execute(new Runnable() {
            @Override
            public void run() {
              logger.info("cachedThreadPool    :{}", Thread.currentThread().getName());
            }
          });
        }
      }
    

    new Fixed ThreadPool 온라인 스 레 드 풀 을 제어 할 수 있 습 니 다.
      /**
       * newFixedThreadPool        ,      .
       */
      @Test
      public void newFixedThreadPool() {
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 20; i++) {
          fixedThreadPool.execute(new Runnable() {
            @Override
            public void run() {
              logger.info("fixedThreadPool    :{}", Thread.currentThread().getName());
            }
          });
        }
      }
    

    new Single ThreadExecutor 는 하나의 스 레 드 풀 만 있 고 스 레 드 에 이상 이 생 긴 후에 만 새로운 스 레 드 를 만 들 수 있 습 니 다.
      /**
       * newSingleThreadExecutor      ,           ,            .
       */
      @Test
      public void newSingleThreadExecutor() {
        ExecutorService newSingleThread = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 20; i++) {
          newSingleThread.execute(new Runnable() {
            @Override
            public void run() {
              logger.info("newSingleThread    :{}", Thread.currentThread().getName());
            }
          });
        }
      }
    

    new Scheduled ThreadPool 은 스케줄 링 기능 을 가 진 스 레 드 풀 로 주기 적 인 작업 을 수행 할 수 있 습 니 다.
    /**
       * newScheduledThreadPool             
       */
      @Test
      public void newScheduledThreadPool() throws InterruptedException {
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);
        executor.scheduleAtFixedRate(() -> {
          long start = new Date().getTime();
          System.out.println("scheduleAtFixedRate       :" +
              DateFormat.getTimeInstance().format(new Date()));
          try {
            Thread.sleep(1000);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          long end = new Date().getTime();
          System.out.println("scheduleAtFixedRate       =" + (end - start) / 1000 + "m");
          System.out.println("scheduleAtFixedRate       :" + DateFormat.getTimeInstance().format(new Date()));
          System.out.println("======================================");
        }, 0, 1, TimeUnit.SECONDS);//initialDelay     ,period:          
    
        Thread.sleep(1000 * 10);
      }
    

    좋은 웹페이지 즐겨찾기