자바 스 레 드 풀 분석
6810 단어 Java
목차
스 레 드 탱크 의 장점
스 레 드 탱크 의 작업 절차
스 레 드 탱크 의 구성 요소
스 레 드 탱크 에 작업 제출
스 레 드 풀 닫 기
자바 자체 스 레 드 탱크
스 레 드 탱크 의 장점
스 레 드 탱크 의 작업 절차
스 레 드 탱크 에 작업 을 제출 한 후에 스 레 드 탱크 는 핵심 스 레 드 탱크 의 스 레 드 가 모두 작업 을 수행 하고 있 는 지 판단 합 니 다. 그렇지 않 으 면 새로운 스 레 드 를 만들어 이 작업 을 수행 합 니 다.핵심 스 레 드 가 작업 을 수행 하고 있 으 면 작업 대기 열 이 가득 찼 는 지 판단 하고, 가득 차지 않 으 면 작업 대기 열 에 작업 을 저장 합 니 다.작업 대기 열 이 가득 차 면 스 레 드 탱크 의 스 레 드 가 가득 차 있 는 지, 가득 차 면 포화 거부 정책 을 실행 하고, 가득 차 지 않 으 면 새로운 스 레 드 를 만들어 작업 을 수행 합 니 다.
스 레 드 탱크 의 구성 요소
ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime, TimeUnit unit,BlockingQueue workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
스 레 드 풀 을 만 들 려 면 위의 매개 변수 가 필요 합 니 다.
코어 풀 사이즈: 핵심 스 레 드 탱크 의 크기 도 스 레 드 탱크 의 기본 크기 로 이해 할 수 있 습 니 다. 스 레 드 탱크 에 작업 을 제출 할 때 스 레 드 탱크 는 스 레 드 를 만들어 작업 을 수행 합 니 다. 다른 남 은 핵심 스 레 드 가 작업 을 수행 할 수 있 더 라 도 새로운 핵심 스 레 드 를 만들어 서 수행 합 니 다.예열 이 완료 되면 실행 해 야 할 작업 수가 스 레 드 탱크 의 기본 크기 보다 많 을 때 다시 만 들 지 않 습 니 다.
maximumPoolSize: 스 레 드 탱크 에서 만 들 수 있 는 최대 스 레 드 수 입 니 다. 작업 대기 열 이 가득 차고 최대 스 레 드 수 보다 적 으 면 스 레 드 탱크 는 새로운 스 레 드 를 만 들 고 작업 을 수행 합 니 다. 작업 대기 열 이 무한 (LinkedBlockingQueue) 이 라면 이 매개 변 수 는 실제 효과 가 없습니다.
keepAlive Time: 스 레 드 탱크 의 작업 스 레 드 가 비어 있 으 면 생존 시간 을 유지 합 니 다. 작업 이 많 고 모든 작업 의 수행 시간 이 짧 을 때 시간 을 늘 려 스 레 드 의 이 용 률 을 높 일 수 있 습 니 다.
TimeUnit :스 레 드 생존 시간의 단위.
workQueue: 작업 대기 열, 실행 을 기다 리 는 작업 의 차단 대기 열 을 저장 합 니 다.
ThreadFactory :스 레 드 를 만 드 는 공장 을 설정 하면 스 레 드 공장 을 통 해 만 든 스 레 드 마다 이름 을 설정 할 수 있 습 니 다.
Rejected Execution Handler: 포화 거부 정책 입 니 다. 대기 열 과 스 레 드 탱크 가 가득 차 면 스 레 드 탱크 가 포화 상태 에 있 음 을 설명 합 니 다. 제출 한 새로운 작업 을 처리 하기 위해 서 는 하나의 전략 을 사용 해 야 합 니 다.일반적으로 기본 값 은 AbortPolicy 입 니 다.
스 레 드 탱크 에 작업 제출
스 레 드 탱크 에 작업 을 제출 하 는 데 는 execute () 와 submit () 두 가지 방법 이 있 습 니 다.
execute () 방법 은 반환 값 이 없 는 작업 을 제출 하 는 데 사용 되 기 때문에 이 작업 이 스 레 드 풀 에 의 해 성공 되 었 는 지 판단 할 수 없습니다.
submit () 방법 은 반환 값 이 있 는 작업 을 제출 하 는 데 사 용 됩 니 다. 스 레 드 풀 은 future 형식의 대상 을 되 돌려 줍 니 다.이 대상 으로 임무 수행 의 성공 여 부 를 판단 할 수 있다.future 의 get () 방법 을 통 해 되 돌아 오 는 값 을 얻 을 수 있 습 니 다.
스 레 드 풀 닫 기
스 레 드 풀 을 닫 는 방법 은 두 가지 가 있 습 니 다. shutdown () 과 shutdown Now () 는 스 레 드 풀 을 닫 습 니 다.스 레 드 탱크 의 작업 스 레 드 를 옮 겨 다 니 며 스 레 드 의 interrupt () 방법 으로 스 레 드 를 중단 하기 때문에 중 단 된 스 레 드 에 응답 하지 못 하면 종료 할 수 없습니다.shutdown Now 는 스 레 드 탱크 의 상 태 를 STOP 로 설정 한 다음 에 실행 중인 스 레 드 나 일시 정지 중인 모든 스 레 드 를 중단 하고 작업 을 기다 리 는 목록 으로 돌아 가 려 고 합 니 다.shutdown 은 스 레 드 탱크 의 상 태 를 SHUTDOWN 상태 로 설정 한 다음 실행 중인 스 레 드 가 없 는 모든 스 레 드 를 중단 합 니 다.
자바 자체 스 레 드 탱크
자바 에서 추천 하 는 4 가지 스 레 드 풀 은 Fixed ThreadPool, Single ThreadExecutor, Cached ThreadPool, Scheduled ThreadPoolExecutor 입 니 다.
실행 과정: 현재 실행 루틴 수
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue());
}
스 레 드 탱크 의 스 레 드 수가 core PoolSize 에 이 르 렀 을 때 새로운 작업 은 무 계 대기 열 에서 기다 리 기 때문에 스 레 드 탱크 의 스 레 드 수 는 core PoolSize 를 초과 하지 않 습 니 다.이 작업 대기 열 은 무한 대기 열 이기 때문에 maximum PoolSize 와 keepAliveTime 은 무효 화 되 며, 실행 중인 Fixed ThreadPool 은 shutdown () 과 shutdown Now () 를 호출 하지 않 을 때 작업 을 거부 하지 않 습 니 다.
실행 과정: 현재 실행 중인 스 레 드 의 수량 이
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue()));
}
실행 과정: 우선 SynchronousQueue. offer (Runnable task) 를 실행 합 니 다. 현재 maximumPool 에 남 은 스 레 드 가 SynchronousQueue. poll 방법 을 실행 하고 있다 면 메 인 스 레 드 가 실 행 된 offer 작업 과 남 은 스 레 드 의 poll 작업 이 성공 하면 메 인 스 레 드 는 빈 스 레 드 에 임 무 를 맡 깁 니 다. maximumPool 이 비어 있 거나 현재 빈 스 레 드 가 없 을 때.CachedThreadPool 은 새 스 레 드 를 만 들 고 작업 을 수행 합 니 다. 이 새 스 레 드 가 생 성 되면 SynchronousQueue. poll 방법 을 실행 합 니 다. 이 poll 작업 은 빈 스 레 드 로 주 스 레 드 의 offer 작업 을 기다 리 게 합 니 다. 60s 내 에 주 스 레 드 가 offer 작업 을 하면 짝 짓 기 에 성공 합 니 다. 주지 않 으 면 이 빈 스 레 드 는 종 료 됩 니 다.
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue());
}
실행 과정: Delay Queue 에서 만 료 된 Scheduled Future Task 를 가 져 오고 이 작업 을 수행 한 후 이 작업 의 time 을 다음 실행 시간 으로 바 꾸 고 Delay Queue 에 다시 놓 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.