JAVA 사용자 정의 스 레 드 탱크 의 최대 스 레 드 수 설정 방법

1:CPU 밀집 형:
정의:CPU 밀집 형 은 밀집 형 을 계산 하 는 것 을 말 하 며,대부분의 시간 을 논리 적 판단 등 CPU 동작 을 계산 하 는 프로그램 을 CPU 밀집 형 작업 이 라 고 한다.이 유형의 작업 은 대량의 계산 을 해 야 하 며 주로 CPU 자원 을 소모 합 니 다.  이런 계산 집약 형 임 무 는 다 중 임무 로 도 수행 할 수 있 지만 임무 가 많 을 수록 임무 전환 에 걸 리 는 시간 이 많 고 CPU 가 임 무 를 수행 하 는 효율 이 낮 기 때문에 CPU 를 가장 효율적으로 활용 하고 집약 형 임무 가 동시에 진행 되 는 수량 을 계산 하 는 것 은 CPU 의 핵심 수 와 같 아야 한다.
특징:
       01:CPU 사용률 이 비교적 높 은 경우(즉,복잡 한 연산,논리 처리 등 을 자주 계산 하 는 경우)
       02:한 대의 기계 에 대해 최대 스 레 드 수 는 일반적으로 CPU 핵심 수의 스 레 드 개수 만 설정 하면 됩 니 다.
       03:이 유형 은 개발 중의 일부 업무 복잡 한 계산 과 논리 처리 과정 에 많이 나타난다.
코드 예제:

package pool;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Demo02 {
 public static void main(String[] args) {
  //      !         ThreadPoolExecutor

  /**
   *          (             !)
   * 1、CPU    ,  ,   ,    CPU     !
   */

  //    CPU  
  System.out.println(Runtime.getRuntime().availableProcessors()); //8 

  ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
    2,               //       
    Runtime.getRuntime().availableProcessors(), //         (CPU   ,  CPU    )
    3,               //            
    TimeUnit.SECONDS,        //    
    new LinkedBlockingDeque<>(3),     //    
    Executors.defaultThreadFactory(),    //    ,     ,     
    new ThreadPoolExecutor.AbortPolicy());  //    ,     ,       ,    

  try {
   //     ,Deque + Max (     +     )
   //      RejectedExecutionException   
   for (int i = 1; i <= 9; i++) {
    //        ,          
    threadPool.execute(()->{
     System.out.println(Thread.currentThread().getName()+" ok");
    });
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   //     ,    ,     
   threadPool.shutdown();  //(     ,        finally )
  }
 }
}
2:IO 밀집 형:
정의:IO 밀집 형 작업 이란 작업 이 대량의 IO 작업 을 수행 해 야 하고 네트워크,디스크 IO 작업 과 관련 되 며 CPU 에 대한 소모 가 적 고 그 소모 하 는 주요 자원 은 IO 이다.
    우리 가 접 한 IO 는 크게 디스크 IO 와 네트워크 IO 로 나 눌 수 있다.
01:디스크 IO 는 대부분 디스크 에 대한 읽 기와 쓰기 동작 입 니 다.가장 흔히 볼 수 있 는 것 은 파일 의 읽 기와 쓰기 입 니 다.만약 에 데이터 베이스,Redis 도 로 컬 에 있다 면 이것 도 디스크 IO 에 속 합 니 다.
02:네트워크 IO,이것 은 여러분 이 더욱 잘 아 실 것 입 니 다.우 리 는 http 요청,원 격 데이터 베이스 읽 기 쓰기,원 격 Redis 읽 기 쓰기 등 각종 네트워크 요청 을 만 날 수 있 습 니 다.
       IO 작업 의 특징 은 기 다 려 야 한 다 는 것 입 니 다.우 리 는 데 이 터 를 요청 하고 상대방 이 버퍼 에 데 이 터 를 기록 하 는 것 입 니 다.이 시간 동안 데 이 터 를 읽 어야 하 는 스 레 드 는 할 일이 없 기 때문에 버퍼 가 가득 쓸 때 까지 CPU 시간 대 를 내 보 낼 수 있 습 니 다.
기왕 이렇게 된 이상 IO 집약 형 임 무 는 사실 매우 큰 최적화 공간 이 있다(기다 림 이 있 기 때문에).
  CPU 사용률 이 낮 고 프로그램 에 대량의 I/O 작업 이 시간 을 차지 하여 스 레 드 의 여가 시간 이 많 기 때문에 보통 CPU 핵심 두 배의 스 레 드 를 열 어야 합 니 다.스 레 드 가 I/O 작업 CPU 가 비어 있 을 때 스 레 드 대기 시간 이 차지 하 는 비율 이 높 을 수록 스 레 드 가 많아 져 야 합 니 다.다른 스 레 드 를 사용 하여 CPU 를 계속 사용 하여 CPU 의 사용률 을 높 여야 합 니 다.스 레 드 CPU 시간 이 차지 하 는 비율 이 높 을 수록 스 레 드 가 적 게 필요 합 니 다.이 유형 은 개발 에서 주로 계산 업무 가 빈번 한 논리 에 나타 납 니 다.
코드 예제:

package pool;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Demo02 {
 public static void main(String[] args) {
  //      !         ThreadPoolExecutor

  /**
   *          (             !)
   * 2、IO     >         IO   
   *     15      io      ! (        30)
   *             io       2 
   */

  //    CPU  
  System.out.println(Runtime.getRuntime().availableProcessors()); //8 

  ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
    2,        //       
    16,                //   IO      15       io      !(         2*CPU   )
    3,        //            
    TimeUnit.SECONDS,     //    
    new LinkedBlockingDeque<>(3),  //    
    Executors.defaultThreadFactory(),    //    ,     ,     
    new ThreadPoolExecutor.DiscardOldestPolicy()); //    ,        ,       

  try {
   //     ,Deque + Max (     +     )
   //      RejectedExecutionException   
   for (int i = 1; i <= 9; i++) {
    //        ,          
    threadPool.execute(()->{
     System.out.println(Thread.currentThread().getName()+" ok");
    });
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   //     ,    ,     
   threadPool.shutdown();  //(     ,        finally )
  }
 }
}
이어서 우 리 는 일일이 분석 했다.
1:높 은 병발,작업 수행 시간 이 짧 은 업무,스 레 드 탱크 스 레 드 수 는 CPU 핵 수+1 로 설정 하여 스 레 드 컨 텍스트 의 전환 을 감소 할 수 있 습 니 다.
2:병발 이 높 지 않 고 임무 수행 시간 이 긴 업 무 는 구분 해서 봐 야 한다.
a)만약 에 업무 시간 이 IO 작업 에 집중 된다 면 IO 밀집 형 작업 입 니 다.IO 작업 이 CPU 를 차지 하지 않 기 때문에 모든 CPU 를 남 겨 두 지 마 십시오.스 레 드 탱크 의 스 레 드 수 를 적당 하 게 늘 려 CPU 가 더 많은 업 무 를 처리 할 수 있 습 니 다.
b)만약 에 업무 시간 이 길 고 계산 작업 에 집중 된다 면 밀집 형 임 무 를 계산 하 는 것 이다.이것 은 어 쩔 수 없다.스 레 드 탱크 의 스 레 드 수 를 적 게 설정 하고 스 레 드 컨 텍스트 의 전환 을 줄인다.
(사실은 1,2 를 통 해 알 수 있 듯 이 병발 이 높 든 높 지 않 든 업무 에서 cpu 밀집 여부 든 I/O 밀집 여부 에 대한 판단 이 필요 한 현재 전 제 는 성능 을 최적화 해 야 하 는 전제 에서)
3:병행 이 높 고 업무 수행 시간 이 길 며 이런 유형의 임 무 를 해결 하 는 관건 은 스 레 드 탱크 가 아니 라 전체적인 구조의 디자인 에 있다.이런 업무 에서 일부 데이터 가 캐 시 를 할 수 있 는 지 를 보 는 것 이 첫 번 째 단계 이다.우리 프로젝트 가 사용 할 때 redis 는 캐 시(이런 비 관계 형 데이터 베 이 스 는 좋 은 것)이다.서버 를 늘 리 는 것 은 두 번 째 단계(일반 정부 프로젝트 의 우선,프로젝트 기술 을 크게 바 꾸 지 않 아 도 되 기 때문에 안정 적 이지 만 전 제 는 자금 이 충분 하 다)이 고 스 레 드 탱크 의 설정 에 대해 서 는 참고 2 를 설치한다.마지막 으로 업무 수행 시간 이 긴 문 제 는 미들웨어(작업 시간 이 너무 길 면 분할 논 리 를 대기 열 에 넣 는 등 조작 을 고려 할 수 있 음)를 사용 하여 임 무 를 분리 하고 결합 할 수 있 는 지 분석 해 야 할 수도 있다.
3.:요약:
01:하나의 계산 위주 의 프로그램(CPU 밀집 형 프로그램),다 중 스 레 드 가 달 릴 때 모든 CPU 핵심 수 를 충분히 이용 할 수 있 습 니 다.예 를 들 어 8 개의 핵심 CPU,8 개의 스 레 드 를 열 때 8 개의 스 레 드 를 동시에 달 릴 수 있 는 연산 작업,이때 가 최대 효율 입 니 다.그러나 스 레 드 가 CPU 핵심 수량 을 훨씬 초과 하면 오히려 작업 효율 이 떨 어 질 수 있 습 니 다.잦 은 스 레 드 전환 도 시간 이 걸 리 기 때 문 입 니 다.따라서 CPU 밀집 형 작업 에 있어 서 스 레 드 수 는 CPU 수 와 같 는 것 이 가장 좋다.
02:디스크 나 네트워크 를 위주 로 하 는 프로그램(IO 밀집 형 프로그램)이 라면 한 스 레 드 가 IO 에서 기다 리 고 있 을 때 다른 스 레 드 는 CPU 에서 뛸 수 있 습 니 다.가끔 은 CPU 가 할 일이 없 을 때 모든 스 레 드 가 IO 를 기다 리 고 있 습 니 다.이때 그들 은 동시 적 입 니 다.단일 스 레 드 는 이때 도 한 사람 이 기다 리 고 있 습 니 다.우 리 는 모두 IO 의 속도 가 CPU 보다 매우 느리다 는 것 을 안다.이때 스 레 드 수가 CPU 핵심 수의 두 배 와 같 으 면 가장 좋다.
이상 은 JAVA 사용자 정의 스 레 드 탱크 의 최대 스 레 드 설정 방법 에 대한 상세 한 내용 입 니 다.JAVA 사용자 정의 스 레 드 탱크 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기