자바 병렬 프로 그래 밍 면접 스 레 드 풀
연못 화 사상 을 바탕 으로 라인 을 관리 하 는 도구 이다.지 화 기술:지 화 기술 은 간단하게 말하자면 대량의 자원 을 미리 보존 하여 불 시의 수요 에 대비 하 는 것 이다.예 를 들 어 우리 의 대상 풀,데이터베이스 연결 풀 등 이다.
스 레 드 탱크 장점
우 리 는 왜 스 레 드 풀 을 사용 해 야 합 니까?직접 new thread start 가 좋 지 않 습 니까?
먼저 스 레 드 탱크 의 실행 프로 세 스 도 를 살 펴 보 겠 습 니 다.이 그림 은 문 말 참조 1 에서 나 왔 습 니 다.
상기 그림 을 통 해 우 리 는 라인 풀 에서 임 무 를 수행 할 수 있 고 다음 과 같은 몇 가지 상황 이 있 을 수 있다.
자바 jdk 의 Executors 는 서로 다른 스 레 드 풀 을 만 드 는 방법(일반적으로 추천 하지 않 음)을 제공 합 니 다.알 리 바 바 의 개발 매 뉴 얼 도 Executors 를 통 해 만 들 지 못 하도록 강제 규정 하고 있 습 니 다.일부 회사 의 개발 규범 에 도 있 을 것 입 니 다.
newFixedThreadPool
newSingleThreadExecutor
newCachedThreadPool
newScheduledThreadPool
newWorkStealingPool
(jdk 1.8 새로 추 가 된)스 레 드 풀 Executor 를 사용 하여 스 레 드 풀 을 만 들 수 있 습 니 다.
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
우 리 는 스 레 드 탱크 를 만 드 는 데 7 개의 매개 변수 가 있 음 을 알 수 있 습 니 다.상기 우리 가 Executors 도구 류 를 통 해 만 든 스 레 드 탱크 는 한두 개의 매개 변수 입 니 다.다른 매개 변 수 는 모두 우리 에 게 기본 적 으로 쓰 여 죽 었 습 니 다.우 리 는 이 몇 개의 매개 변 수 를 진정 으로 이해 해야만 스 레 드 탱크 를 더욱 잘 사용 할 수 있 습 니 다.다음은 이 일곱 개의 매개 변수(스 레 드 탱크 매개 변수)를 살 펴 보 겠 습 니 다.corePoolSize
핵심 스 레 드 수(스 레 드 탱크 의 기본 크기)는 스 레 드 탱크 에 작업 을 제출 할 때 스 레 드 를 만들어 작업 을 수행 합 니 다.우리 가 수행 해 야 할 작업 수가 핵심 스 레 드 보다 많 으 면 더 이상 만 들 지 않 습 니 다.prestart AllCoreThreads()측 법 선 스 레 드 탱크 를 호출 하면 모든 기본 스 레 드 를 미리 만 들 수 있 습 니 다.
maximumPoolSize
최대 스 레 드 수:스 레 드 탱크 에서 만 들 수 있 는 최대 스 레 드 수 입 니 다.대기 열 이 가득 차 있 고 만 든 스 레 드 수가 최대 스 레 드 보다 적 으 면 스 레 드 탱크 는 새로운 스 레 드 를 만들어 작업 을 수행 합 니 다.여기에 작은 지식 이 있 습 니 다.만약 우리 의 대기 열 이 무한 대기 열 을 사용한다 면 이 매개 변 수 는 작용 하지 않 을 것 입 니 다.왜냐하면 우리 의 임 무 는 계속 대기 열 에 추 가 될 것 이기 때 문 입 니 다.대기 열 은 영원히 채 워 지지 않 을 것 입 니 다.(메모리 가 허용 되 는 경우)
keepAliveTime
남 은 스 레 드 최대 생존 시간.현재 스 레 드 수가 핵심 스 레 드 보다 많 을 때 남 은 스 레 드 를 끝내 고 새 작업 을 기다 리 는 가장 긴 시간 입 니 다.기본 적 인 상황 에서 스 레 드 탱크 의 스 레 드 수가
corePoolSize
보다 클 때 만 keepAliveTime
이 역할 을 할 수 있 습 니 다.스 레 드 탱크 의 스 레 드 수가 core PoolSize 보다 크 지 않 습 니 다.즉,스 레 드 탱크 의 스 레 드 수가 corePoolSize
보다 클 때 한 스 레 드 가 남 은 시간 이 keepAliveTime
에 이 르 면 스 레 드 탱크 의 스 레 드 수가 corePoolSize
을 초과 하지 않 을 때 까지 종 료 됩 니 다.그러나
allowCoreThreadTimeOut(boolean)
방법 을 호출 하면 온라인 스 레 드 탱크 의 스 레 드 수가 corePoolSize
보다 크 지 않 을 때 keepAliveTime
매개 변수 도 역할 을 하고 스 레 드 탱크 의 스 레 드 수가 0 일 때 까지 역할 을 한다.예 를 들 어 현재 스 레 드 탱크 의 최대 스 레 드 수(maximumPoolSize
)는 50 이 고 핵심 스 레 드 수(core PoolSize)는 10 이다.현재 작업 을 하고 있 는 스 레 드 수 는 30 이다.그 다음 에 20 개의 스 레 드 를 비 워 서 일 을 하지 않 았 기 때문에 이 20 개의 스 레 드 는 없어 지고 당 나 귀 를 죽 이 는 느낌 이 든다.남 은 30 개의 스 레 드 가 일 을 끝내 고
keepAliveTime
을 이렇게 오래 쉬 었 다 면 이 30 개의 스 레 드 에서 도 20 개 를 소각 하고 핵심 스 레 드 를 유지 해 야 한다.allowCoreThreadTimeOut
을 설치 하면 true
과 같은 핵심 라인 도 폐기 된다.우리 가 아웃 소 싱 프로젝트 를 하 는 것 과 마찬가지 로 갑 의 프로젝트 가 완성 되면 다른 갑 에 가 야 합 니 다.만약 에 짧 은 시간 안에 갑 이 당신 을 받 아들 이지 않 으 면 당신 은 해고 당 할 것 입 니 다.몇 명의 핵심 인원 만 남 겨 두 고 프로젝트 를 지 켜 야 합 니 다.갑 의 프로젝트 를 지 키 면 자신의 사람 을 사용 하면 모든 아웃 소 싱 자 는 해고 당 할 것 입 니 다.unit
스 레 드 생존 시간의 단위.선택 할 수 있 는 단 위 는 days,hours 등 이 있 습 니 다.
workQueue
작업 대기 열.다음 대기 열 을 선택 할 수 있 습 니 다.
threadFactory
사용자 가 스 레 드 를 만 드 는 공장 을 설정 하면 우 리 는 이 공장 을 통 해 업무 적 의미 가 있 는 스 레 드 이름 을 만 들 수 있 습 니 다.사용자 정의 스 레 드 공장 과 기본 스 레 드 공장 이 만 든 이름 을 비교 할 수 있 습 니 다.
기본 스 레 드 이름 사용자 정의 스 레 드 공장 이름
pool-5-thread-1 testPool-1-thread-1
아 리 개발 매 뉴 얼 도 의미 있 는 스 레 드 이름 을 지정 해 야 한 다 는 점 을 분명히 했다.
ejectedExecutionHandler
스 레 드 탱크 거부 정책.대기 열과 스 레 드 탱크 가 가득 찼 을 때 스 레 드 탱크 가 포화 상태 에 있다 는 것 을 설명 한다.새로 제출 한 임 무 를 처리 하기 위해 서 는 일정한 전략 을 취해 야 한다.jdk 는 기본적으로 네 가지 거부 정책 을 제공 합 니 다.
사실 저 희 는 작업 거부 정책(
RejectedExecutionHandler
인터페이스 실현)을 사용자 정의 할 수 있 습 니 다.예 를 들 어 작업 이 거부 되면 로 그 를 기록 하거나 다시 시도 하 는 등 자신의 업무 수요 에 따라 이 루어 질 수 있 습 니 다.dubbo 작업 거부 정책
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
String msg = String.format("Thread pool is EXHAUSTED!" +
" Thread Name: %s, Pool Size: %d (active: %d, core: %d, max: %d, largest: %d), Task: %d (completed: "
+ "%d)," +
" Executor status:(isShutdown:%s, isTerminated:%s, isTerminating:%s), in %s://%s:%d!",
threadName, e.getPoolSize(), e.getActiveCount(), e.getCorePoolSize(), e.getMaximumPoolSize(),
e.getLargestPoolSize(),
e.getTaskCount(), e.getCompletedTaskCount(), e.isShutdown(), e.isTerminated(), e.isTerminating(),
url.getProtocol(), url.getIp(), url.getPort());
logger.warn(msg);
dumpJStack();
dispatchThreadPoolExhaustedEvent(msg);
throw new RejectedExecutionException(msg);
}// Java :756584822
dubbo 의 거부 정책 은 주로 warm 로 그 를 상세 하 게 기록 하고 현재 스 레 드 스 택 의 상세 한 정 보 를 출력 하 며 거부 작업 이상 을 계속 던 지 는 것 을 알 수 있 습 니 다.스 레 드 탱크 매개 변 수 는 어떻게 설정 합 니까?
스 레 드 탱크 에 이렇게 많은 매개 변수 가 있 는 이상 우 리 는 어떻게 자신의 업무 실제 상황 에 따라 모든 매개 변 수 를 합 리 적 으로 설정 합 니까?
모니터링 스 레 드 탱크
스 레 드 탱크 작업 은 포화 상태 입 니까?라인 의 상황 은 어 떻 습 니까?총 몇 개의 임 무 를 수행 하 였 습 니까?현재 스 레 드 탱크 의 운행 상황 은 어 떻 습 니까?대열 안에 쌓 인 임무 가 있 습 니까?위의 이런 문제 에 직면 하여 스 레 드 탱크 도 우리 가 위의 이런 지 표를 볼 수 있 는 방법 을 제공 할 수 있다.
이런 매개 변수 가 있 으 면 우 리 는 스 레 드 탱크 의 매개 변 수 를 조정 하 는 것 이 더욱 편리 합 니까?또는 스 레 드 탱크 의 활약 정도 에 따라 스 레 드 탱크 의 인 자 를 자동 으로 조절 합 니 다.
질문
스 레 드 탱크 는 핵심 스 레 드 와 비 핵심 스 레 드 를 구분 합 니까?
어떻게 핵심 라인 이 소각 되 지 않도록 보증 합 니까?
스 레 드 탱크 의 스 레 드 는 어떻게 재 활용 합 니까?
총결산
이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 실 수 있 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.