왜 알리 자바 법령 집행 인 내장 스레드 풀을 만들 자바를 사용 금지?

IDEA 가져 오기 프로토콜은 코드를 작성할 때, 자동으로 빨간 선을 정렬하고 당신을 생각 나게하는, 알리를 연결합니다.

수동으로 스레드 풀을 만들 텔, 효과는 더 좋을 것이다.

퀘스트 이유 전에 우리는 먼저 스레드 풀 ThreadPoolExecutor입니다 매개 변수와 그 의미가 무엇인지 살펴 봅니다.

ThreadPoolExecutor입니다 생성자 :

공용 가능한 ThreadPoolExecutor (INT corePoolSize를, 
                              INT maximumPoolSize를, KeepaliveTime은, 
                              TimeUnit와 유닛 
                              의 BlockingQueue <Runnable를> Workqueue는,  ThreadFactory를 ThreadFactory를,  RejectedExecutionHandler 핸들러) {  // 코드 ...  }

 매개 변수를 의미 :

1.corePoolSize 스레드 풀의 스레드 수를 지정, 핵심 스레드 풀 크기
2.maximumPoolSize은의 스레드 풀에서 스레드의 최대 개수를 지정
스레드 풀 스레드의 수는 얼마나 의지 corePoolSize를 시간, 여분의 유휴 스레드,보다 큰 3.keepAliveTime을 그것은 파괴된다.
4.unit 시간 단위
제출 기억하지만 작업이 실행되지 않은 태스크를위한 5.workQueue 큐.
6.threadFactory 스레드 공장은 일반적으로 기본값을 사용하여 스레드를 생성하는 데 사용
정책, 너무 많은 작업 방법과 작업을 거부하는 거부 7.handler. maximumPoolSize를 +이 Workqueue 및 RejectedExecutionHandler 다루는 작업의 크기를 작업의 수를 초과 제출할 때

 

필수 수동으로 이러한 매개 변수를 스레드 풀을 만들고, 왜 알리 법령 이유. 왜 허용하지 특정 법령 그렇게 말한다 :

실행자 스레드 풀을 만들 수 있지만, ThreadPoolExecutor입니다 방법으로,이 방법은 학생들이 자원 고갈의 위험을 방지하기 위해, 더 명시 적으로 운영 규칙 스레드 풀을 작성할 수 없습니다.

설명 : 각 메소드 실행자의 단점 :
1) 인 newFixedThreadPool 및 newSingleThreadExecutor :
  주된 문제는 매우 큰 메모리에도 OOM 소모 할 수 요청 처리 큐의 축적이다.
2) newCachedThreadPool 및 인 newScheduledThreadPool는 :
  가장 큰 문제는 스레드 매우 많은 수의도 움을 만들 수 있습니다, 스레드의 최대 수에 Integer.MAX_VALUE입니다.

이 두 가지 단점이 발생하는 방법을 봐.

는 Integer.MAX_VALUE 스레드의 블로킹 큐의 크기를 만들 많은 수의 요청을 축적 할 수, 메모리를 많이 소모, 심지어 OOM으로 이어질 때문에 첫 번째입니다.

두 번째는 스레드 풀을 만들 수있는 스레드의 최대 수에 Integer.MAX_VALUE를 허용하기 때문에, 스레드, 자원의 소비의 큰 숫자를 만들고, 심지어 OOM으로 이어질 수있다.

모두 약간 극단적, 소스 코드에 볼 수있는 작은 점을 볼 수 있습니다.

알리 법령 옹호 수동으로 부여하는 대신 Java 스레드 풀에 건설되고, 예를 들어, 스레드 풀을 만들 :

성신 1 :

// org.apache.commons.lang3.concurrent.BasicThreadFactory 
ScheduledExecutorService를 ExecutorService를 = 신규 로 스케줄 (1 ,
    새로운 BasicThreadFactory.Builder (). namingPattern ( "예 스케줄 - 수영장 - %의 D"). 데몬 (  ) .build () );

 

성신 2 :

ThreadFactory를 namedThreadFactory = 새로운 ThreadFactoryBuilder () setNameFormat. ( "데모 수영장 - %의 D" ) .build (); 

// 공통점 풀 
ExecutorService를 풀 = 새로운 ThreadPoolExecutor에 (5, 200 ,
 0L , TimeUnit.MILLISECONDS,
 새로운 <Runnable를> LinkedBlockingQueue 등 (1024), namedThreadFactory, 새로운 ThreadPoolExecutor.AbortPolicy ()); 

pool.execute (() -> 에서 System.out.println (는 Thread.currentThread () getName ()).); 
pool.shutdown (); // 정상적으로 종료

 

성신 3 :

<빈 ID = "userThreadPool 「
    클래스 ="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor "> 
  <속성 명 ="corePoolSize를 "값 ="10 "/> 
  <속성 명 ="maxPoolSize 「값 = "100"/> 
  < 속성 이름 = "queueCapacity"값 = "2000"/> 

  <속성 이름 = "ThreadFactory를"값 = ThreadFactory를 /> 
  <속성 이름 = "rejectedExecutionHandler"> 
    <REF 지역 = "rejectedExecutionHandler"/> 
  </ 부동산> 
</ 콩> // 코드에서 
userThreadPool.execute (스레드);

 

---

있는 공개 문제, 프로그래밍 애비뉴는 "수동"알리 자바 개발 설명서의 최신 버전을 응답하지 않습니다.

 

 


추천

출처www.cnblogs.com/ibigboy/p/11298004.html