왜 알리바바는Executors를 사용하지 않고 스레드 탱크를 만듭니까?
9981 단어 병렬 프로그래밍
앞에 쓰다
이 글을 읽으면 다음과 같은 내용을 알 수 있습니다.
스레드 탱크의 정의
일련의 작업 라인을 관리하다.스레드 풀을 통해 스레드를 재사용할 경우 다음과 같은 이점이 있습니다.
Executors에서 스레드 풀을 만드는 방법
반환된 객체 유형에 따라 스레드 풀을 만드는 세 가지 유형은 다음과 같습니다.
ThreadPoolExecutor 객체
Executors에서 스레드 탱크를 만드는 방법을 소개하기 전에 ThreadPoolExecutor를 소개합니다. 이런 스레드 탱크를 만드는 정적 방법은 ThreadPoolExecutor 대상을 되돌려주는 것이기 때문입니다. 우리가 수동으로 ThreadPoolExecutor 대상을 만드는 것과 다른 것은 우리가 구조 함수를 전달할 필요가 없는 매개 변수입니다.
ThreadPoolExecutor의 구조 함수는 모두 네 개이지만 최종적으로 호출된 함수는 모두 같다.
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
구조 함수 매개변수 설명:
논리 설명을 실행하려면 다음과 같이 하십시오.
Executors 만들기 ThreadPoolExecutor 객체 반환
Executors는 ThreadPoolExecutor 객체를 반환하는 세 가지 방법으로 작성됩니다.
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue());
}
CachedThreadPool은 필요에 따라 새 스레드를 만드는 스레드 풀입니다.
임무를 제출할 때 코어 Pool Size는 0으로 핵심 라인을 만들지 않습니다. SynchronousQueue는 요소를 저장하지 않는 대기열로 팀이 영원히 꽉 차 있기 때문에 최종적으로 비핵심 라인을 만들어서 임무를 수행합니다.
비핵심 라인이 60s 비어 있을 때 회수됩니다.Integer 때문에.MAX_VALUE는 매우 커서 무한히 라인을 만들 수 있다고 여길 수 있으며 자원이 제한된 상황에서 OOM 이상을 일으키기 쉽다
Executors#newSingleThreadExecutor 방법
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue()));
}
SingleThreadExecutor는 단일 스레드 스레드 풀로 코어 스레드 하나만 있음
작업이 제출되면 먼저 핵심 라인을 만들어서 작업을 수행합니다. 핵심 라인의 수량을 초과하면 대기열에 넣습니다. 링크드 블록 Queue는 Integer이기 때문입니다.MAX_VALUE의 대기열은 무계 대기열이라고 할 수 있기 때문에 대기열에 무한한 많은 작업을 삽입할 수 있습니다. 자원이 제한될 때 OOM 이상을 일으키기 쉽습니다. 또한 무계 대기열로 인해maximumPoolsize와keepAliveTime 파라미터는 무효가 되고 비핵심 라인을 만들지 않습니다.
Executors#newFixedThreadPool 방법
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue());
}
FixedThreadPool은 고정 코어 스레드 풀로, 고정 코어 스레드 수는 사용자가 전송
요약:
OOM 예외 테스트
이론적으로 OOM 예외가 발생할 수 있으므로 한 차례의 검증 전 표현을 테스트해야 합니다.
테스트 클래스: TaskTest.java
public class TaskTest {
public static void main(String[] args) {
ExecutorService es = Executors.newCachedThreadPool();
int i = 0;
while (true) {
es.submit(new Task(i++));
}
}
}
Executors에서 만든 CachedThreadPool을 사용하여 스레드 풀에 스레드를 무제한으로 추가
테스트 클래스를 시작하기 전에 JVM 메모리를 좀 작게 조정해야 한다. 그렇지 않으면 컴퓨터를 쉽게 문제를 일으킬 수 있다. [왜 알았는지 묻지 마라. 철바보가 틀림없다!!!]아이디어에서:
Run -> Edit Configurations
JVM
매개 변수 설명: --Xms10M =>Java Heap
메모리 초기화 값Java Heap
최대 메모리 Exception: java.lang.OutOfMemoryError thrown from the UncaughtExceptionHandler in thread "main"
Disconnected from the target VM, address: '127.0.0.1:60416', transport: 'socket'
3w 여러 개의 라인을 만들 때
OOM
오류를 보고하기 시작합니다. 다른 두 개의 라인 탱크는 테스트를 하지 않습니다. 테스트 방법은 일치하지만 생성된 라인 탱크는 같지 않습니다.스레드 탱크 파라미터를 어떻게 정의합니까
CPU
수량 + 1로 권장 CPU
수량Runtime.availableProcessors
방법에 따라 CPU
수량*CPU
활용도*(1 + 스레드 대기 시간/스레드 CPU 시간)CPU
밀집형과 IO
밀집형으로 나누고 각각 다른 스레드 풀로 처리하여 각 스레드 풀을 각자의 작업 부하에 따라 조정할 수 있도록 한다AbortPolicy
거부 정책을 사용하고 프로그램에서 직접 RejectedExecutionException
이상을 던집니다. [실행 시 이상이기 때문에 강제하지 않습니다catch
]. 이런 처리 방식은 우아하지 않습니다.처리 거부 정책에는 다음과 같은 비교 권장 사항이 있습니다.RejectedExecutionException
이상을 포획하고 포획이상에서 임무를 처리한다.기본 거부 정책용CallerRunsPolicy
대기열에 저장되고 TCP 대기열이 가득 차면 클라이언트에게 영향을 주며 느린 성능 저하TCP
인터페이스만 있으면 된다RejectedExecutionHandler
와DiscardPolicy
거부 정책을 사용하여 임무를 버려도 된다만약에 Executors의 정적 방법으로
DiscardOldestPolicy
대상을 만들면 ThreadPoolExecutor
를 사용하여 임무의 집행을 제한할 수 있고 Semaphore
이상이 발생하지 않도록 할 수 있다. 왜냐하면 스레드 탱크의 매개 변수에 대한 정의 경험이 적기 때문에 모두 이론 지식이다. 경험이 있는 남자가 보충하는 것을 환영한다.저자: 하달달이가 있나 주진아.im/post/5dc41c165188257bad4d9e69
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
왜 알리바바는Executors를 사용하지 않고 스레드 탱크를 만듭니까?스레드 탱크는 Executors를 사용하여 만들 수 없고 ThreadPool Executor를 통해 원본 코드를 통해 사용하지 않는 원인을 분석한다. 일련의 작업 라인을 관리하다.스레드 풀을 통해 스레드를 재사용할 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.