자바 의 몇 가지 스 레 드 탱크 유형 소개 및 사용 방법 에 대해 상세히 이야기 하 다.

1.스 레 드 탱크 사용 장면
•단일 작업 처리 시간 이 짧다
•처리 해 야 할 임무 의 수량 이 많다
2.자바 스 레 드 풀 을 사용 하면 좋 은 점
1.new Thread()를 사용 하여 스 레 드 를 만 드 는 단점:
•new Thread()를 통 해 대상 을 만 들 때마다 성능 이 좋 지 않 습 니 다.
•스 레 드 는 통일 적 인 관리 가 부족 하여 새로운 스 레 드 를 제한 하지 않 고 서로 경쟁 할 수 있 으 며 너무 많은 시스템 자원 을 점용 하여 다운 되 거나 oom 을 초래 할 수 있 습 니 다.
•정시 실행,정기 실행,스 레 드 중단 등 더 많은 기능 이 부족 합 니 다.
2.자바 스 레 드 풀 을 사용 하 는 장점:
•존재 하 는 스 레 드 를 다시 사용 하여 대상 의 생 성,소멸 비용 을 줄 이 고 성능 을 향상 시 킵 니 다.
•최대 병발 라인 수 를 효과적으로 제어 하고 시스템 자원 의 사용률 을 높 일 수 있 으 며 과도 한 자원 경쟁 을 피하 고 막힘 을 피 할 수 있다.
•정시 집행,정기 집행,단일 스 레 드,병발 수 제어 등 기능 을 제공 합 니 다.
자바 네 가지 스 레 드 탱크
자바 에 있 는 스 레 드 탱크 의 최상 위 인 터 페 이 스 는 Executor 이지 만 엄격 한 의미 에서 Executor 는 스 레 드 탱크 가 아니 라 스 레 드 를 실행 하 는 도구 입 니 다.진정한 스 레 드 탱크 인 터 페 이 스 는 Executor Service 입 니 다.다음 그림 은 스 레 드 탱크 의 유형 체계 구 조 를 완전 하 게 묘사 했다.

1. newCachedThreadPool
필요 에 따라 새 스 레 드 를 만 들 수 있 는 스 레 드 풀 을 만 들 지만 이전 구조의 스 레 드 가 사용 가능 할 때 다시 사용 합 니 다.단기 비동기 임 무 를 많이 수행 하 는 프로그램 에 있어 서 이러한 스 레 드 탱크 는 일반적으로 프로그램의 성능 을 향상 시 킬 수 있다.execute 를 호출 하면 이전 구조의 스 레 드 를 다시 사용 합 니 다.기 존 스 레 드 가 사용 되 지 않 으 면 새 스 레 드 를 만 들 고 풀 에 추가 합 니 다.60 초 동안 사용 되 지 않 은 스 레 드 를 종료 하고 캐 시 에서 제거 합 니 다.따라서 장시간 빈 스 레 드 탱크 는 자원 을 사용 하지 않 는 다.
public static ExecutorService newCachedThreadPool()
예제 코드:

public class ThreadPoolExecutorTest {
   public static void main(String[] args ) {
    ExecutorService cacheThreadPool =Executors.newCachedThreadPool();
     for(int i =1;i<=5;i++){
       final int index=i ;
       try{
        Thread.sleep(1000);
      }catch(InterruptedException e ) {
         e.printStackTrace();
      }
       cacheThreadPool.execute(new Runnable(){
         @Override
         public void run() {
          System.out.println(" " +index +"   " +Thread.currentThread().getName());  
        }  
      });
    }
  }
}


//    
 1   pool-1-thread-1
 2   pool-1-thread-1
 3   pool-1-thread-1
 4   pool-1-thread-1  5   pool-1-thread-1  
결 과 를 통 해 알 수 있 듯 이 두 번 째 임 무 를 수행 할 때 첫 번 째 임 무 는 이미 완성 되 었 고 첫 번 째 임 무 를 수행 하 는 스 레 드 를 다시 사용 할 것 이 며 매번 새 스 레 드 를 만 들 지 않 아 도 된다.
2. newFixedThreadPool
지정 한 작업 스 레 드 수량의 스 레 드 풀 을 만 듭 니 다.작업 을 제출 할 때마다 작업 스 레 드 를 만 듭 니 다.작업 스 레 드 수가 스 레 드 탱크 의 초기 최대 수 에 도달 하면 제출 한 작업 을 풀 대기 열 에 저장 합 니 다.
public static ExecutorService newFixedThreadPool(int nThreads)
nThreads-풀 의 스 레 드 수
예제 코드:

public class ThreadPoolExecutorTest {
   public static void main(String[] args) {
    ExecutorService fixedThreadPool =Executors. newFixedThreadPool(3);
     for (int i =1; i<=5;i++){
       final int index=i ;
       fixedThreadPool.execute(new Runnable(){
         @Override
         public void run() {
           try {
            System.out.println(" " +index + "   " +Thread.currentThread().getName());
            Thread.sleep(1000);
          } catch(InterruptedException e ) {
             e .printStackTrace();
          }
        }

      });
    }
  }
}
최대 스 레 드 수가 3 으로 설정 되 어 있 기 때문에 세 개의 수 를 출력 한 후 2 초 를 기 다 렸 다가 출력 을 계속 합 니 다.
2. newScheduledThreadPool
주어진 지연 후 명령 을 실행 하거나 정기 적 으로 실행 할 수 있 는 스 레 드 풀 을 만 듭 니 다.
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
core PoolSize-풀 에 저 장 된 스 레 드 수 는 스 레 드 가 비어 있어 도 포 함 됩 니 다.
실행 지연 예제 코드:

public class ThreadPoolExecutorTest {  
  public static void main(String[] args) {
    ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3);   
    scheduledThreadPool.schedule(newRunnable(){     
      @Override 
      public void run() {
       System.out.println("    ");
       }
   }, 3, TimeUnit.SECONDS);
  }
}
3 초 지연
예제 코드 를 정기 적 으로 실행 합 니 다:

public class ThreadPoolExecutorTest {  
  public static void main(String[] args) {

    ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3);    
  scheduledThreadPool.scheduleAtFixedRate(newRunnable(){    
    @Override      
    public void run() {
       System.out.println("  1         ");
     }
   },1,3,TimeUnit.SECONDS);
 }

}
1 초 지연 후 3 초 에 한 번 씩 실행 함 을 나타 낸다.
4.newSingleThreadExecutor
하나의 워 커 스 레 드 를 사용 하 는 Executor 를 만 들 고 이 스 레 드 를 무 계 대기 열 로 실행 합 니 다.(닫 기 전 실행 에 실 패 했 기 때문에 이 단일 스 레 드 를 종료 하면 필요 하 다 면 새 스 레 드 가 후속 작업 을 대신 할 것 입 니 다).각 임 무 를 순서대로 수행 할 수 있 고 주어진 시간 에 여러 개의 스 레 드 가 활동 하지 않 습 니 다.다른 같은 효 과 를 가 진 new Fixed ThreadPool(1)과 달리 이 방법 으로 돌아 오 는 실행 프로그램 을 다시 설정 하지 않 아 도 다른 스 레 드 를 사용 할 수 있 습 니 다.
public static ExecutorService newSingleThreadExecutor()
예제 코드:

public class ThreadPoolExecutorTest {  
  public static void main(String[] args) {
    ExecutorService singleThreadPool= Executors.newSingleThreadExecutor();    
    for(int i=1;i<=5;i++){      
      int index=i;      
    singleThreadPool.execute(new Runnable(){
       @Override
       public void run() {         
        try{
         System.out.println(" "+index+"   ");
        Thread.sleep(2000);
         }catch(InterruptedException e) {            
          e.printStackTrace();
        }
      } });
    }
  }
}
이상 의 이 편 은 자바 의 몇 가지 스 레 드 풀 유형 에 대한 소개 와 사용 방법 은 바로 작은 편집 이 여러분 에 게 공유 하 는 모든 내용 입 니 다.여러분 께 참고 가 되 고 여러분 들 이 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기