자바 가 제공 하 는 네 가지 스 레 드 탱크
6538 단어 Java
단독 스 레 드 대신 스 레 드 풀 을 사용 하 는 것 을 추천 합 니 다.많은 요청 을 처리 할 때 모든 요청 이 하나의 스 레 드 를 열 려 면 시스템 은 스 레 드 를 계속 만 들 고 소각 해 야 합 니 다.스 레 드 가 진정 으로 실행 되 는 시간 보다 길 고 시스템 비용 을 증가 해 야 합 니 다.
자바 자체 가 네 가지 스 레 드 탱크 를 제공 하여 일부 기능 을 실현 하 였 다.
스 레 드 탱크
간단 한 해석
newSingleThreadExecutor
하나의 스 레 드 만 작업 하고 있 으 며,다른 작업 은 캐 시 대기 열 에 있 습 니 다.모든 작업 을 단일 스 레 드 직렬 로 수행 하 는 것 과 같 습 니 다.이상 이 끝나 면 새 스 레 드 를 만 듭 니 다.
newFixedThreadPool
고정 크기 의 스 레 드 풀 을 만 들 고 작업 을 제출 할 때마다 스 레 드 를 만 들 고 값 을 설정 할 때 까지 다른 작업 은 캐 시 대기 열 에 넣 습 니 다.이상 이 끝나 면 새 스 레 드 를 만 듭 니 다.
newCachedThreadPool
버퍼 풀,작업 제출 시 스 레 드 를 만 들 고 60s 가 넘 으 면 스 레 드 를 회수 합 니 다.무한 스 레 드.OkHttp 는 이런 방식 으로 보 내 는 요청 을 관리 합 니 다.
newScheduledThreadPool
정기 적 이 고 주기 적 인 작업 을 수행 할 수 있 는 긴 라인 풀 을 만 듭 니 다.
newSingleThreadExecutor
구조 함수:설정 매개 변 수 를 통 해 알 수 있 듯 이 core PoolSize 는 1 만 있 고 캐 시 대기 열 은 무한 대기 열 입 니 다.
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue()));
}
프로젝트 의 실례 화:
private static void singleExecutor(){
ExecutorService executor = Executors.newSingleThreadExecutor();
execute(executor);
}
6 개 퀘 스 트 수행 시
작업 1 을 핵심 대기 열 에 추가 하여 실행 하고,기타 2~6 은 캐 시 대기 열 에 넣 습 니 다.
작업 1 이 완료 되면 캐 시 대기 열 에서 2 를 꺼 내 실행 합 니 다.
6 개의 미 션 을 모두 수행 할 때 까지
실행 결 과 는 다음 과 같 습 니 다.
1 is running...
1 is end !!!
2 is running...
2 is end !!!
3 is running...
3 is end !!!
4 is running...
4 is end !!!
5 is running...
5 is end !!!
6 is running...
6 is end !!!
newFixedThreadPool
구조 함수:설정 매개 변 수 를 통 해 알 수 있 듯 이 core PoolSize 는 maximumPooSize 와 크기 가 같 고 캐 시 대기 열 은 무한 대기 열 입 니 다.따라서 핵심 스 레 드 만 존재 합 니 다.설 정 된 작업 개 수 를 초과 하면 캐 시 대기 열 에 넣 고 새로운 스 레 드 를 만 들 지 않 습 니 다.
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue());
}
프로젝트 의 실례 화:
private static void fixedExecutor(){
ExecutorService executor = Executors.newFixedThreadPool(2);
execute(executor);
}
6 개 퀘 스 트 수행 시
작업 1 과 2 는 핵심 스 레 드 에서 실 행 됩 니 다.다른 3~6 은 캐 시 대기 열 에 놓 습 니 다.
작업 1 과 2 를 실행 하고 캐 시 대기 열 에서 3 과 4 를 꺼 내 실행 합 니 다.
작업 3 과 4 가 끝나 면 캐 시 대기 열 에서 5 와 6 을 꺼 내 실행 합 니 다.
실행 결 과 는 다음 과 같 습 니 다.
1 is running...
2 is running...
2 is end !!!
1 is end !!!
3 is running...
4 is running...
4 is end !!!
3 is end !!!
6 is running...
5 is running...
5 is end !!!
6 is end !!!
newCachedThreadPool
구조 함수:설정 매개 변 수 를 통 해 알 수 있 듯 이 core PoolSize 는 0 이 고 maximumPooSize 는 Integer.MAX 입 니 다.VALUE,핵심 스 레 드 가 없 으 면 작업 이 오 면 스 레 드 를 만 들 고 스 레 드 가 60s 가 넘 으 면 회수 합 니 다.
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue());
}
프로젝트 의 인 스 턴 스:
private static void cacheExecutor(){
ExecutorService executor = Executors.newCachedThreadPool();
execute(executor);
}
6 개 퀘 스 트 수행 시
미 션 1~6 함께 수행
모두 실행 이 끝 난 후,스 레 드 가 60s 를 초과 한 후,스 레 드 회수
실행 결 과 는 다음 과 같 습 니 다.
1 is running...
3 is running...
2 is running...
4 is running...
5 is running...
6 is running...
1 is end !!!
4 is end !!!
5 is end !!!
6 is end !!!
2 is end !!!
3 is end !!!
Process finished with exit code 0
여기 서 몇 마디 더 하 자. Thread PoolExecutor 의 keepAliveTime 이라는 매개 변 수 는 스 레 드 탱크 에서 core PoolSize 수 를 초과 하 는 남 은 스 레 드 의 최대 생존 시간 을 말 합 니 다.즉,핵심 스 레 드 를 제외 하고 만 든 스 레 드 입 니 다.핵심 스 레 드 가 아 닙 니 다.기본 핵심 스 레 드 는 자동 으로 회수 되 지 않 습 니 다.그래서 Thread PoolExecutor 를 사용 할 때 자원 방출 문 제 를 주의 하 세 요.저 는 다음 에 이곳 을 연구 하고 싶 습 니 다.
핵심 스 레 드 가 비어 있 을 때 도 회수 할 수 있다 면 allowCoreThreadTimeOut(true)을 설정 하면 스 레 드 탱크 에서 core 스 레 드 가 keepAlive 에 남 아 있 을 때 도 닫 힙 니 다.
newScheduledThreadPool
구조 함수:설정 매개 변 수 를 통 해 알 수 있 듯 이 corePoolSize 를 설정 한 매개 변수 이 고 maximumPooSize 는 Integer.MAX 입 니 다.VALUE,기본 스 레 드 keep-alive 의 시간 은 10ms 입 니 다.
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE,
DEFAULT_KEEPALIVE_MILLIS, MILLISECONDS,
new DelayedWorkQueue());
}
private static final long DEFAULT_KEEPALIVE_MILLIS = 10L;
프로젝트 의 실례 화 는 ScheduledExecutorService 와 함께 사용 해 야 합 니 다.
private static void scheduledExecutor(){
ScheduledExecutorService executor = Executors.newScheduledThreadPool(2);
executor.scheduleAtFixedRate(new NameRunnable(1),1L,3L, TimeUnit.SECONDS);
executor.scheduleAtFixedRate(new NameRunnable(2),1L,3L, TimeUnit.SECONDS);
executor.scheduleAtFixedRate(new NameRunnable(3),1L,3L, TimeUnit.SECONDS);
executor.scheduleAtFixedRate(new NameRunnable(4),1L,3L, TimeUnit.SECONDS);
executor.scheduleAtFixedRate(new NameRunnable(5),1L,3L, TimeUnit.SECONDS);
executor.scheduleAtFixedRate(new NameRunnable(6),1L,3L, TimeUnit.SECONDS);
}
6 개 퀘 스 트 수행 시:
시작 하면 작업 1 과 2(설 정 된 core Size 는 2)를 실행 하고 나머지 3~6 은 캐 시 대기 열 에 추가 합 니 다.
1 과 2 를 실행 한 후 대열 에서 3 과 4 를 취하 여 순서대로 유추 하 다.
5 와 6 이 실 행 된 후에 다시 1 과 2 부터 실 행 됩 니 다.
실행 결 과 는 다음 과 같 습 니 다.
2 is running...
1 is running...
1 is end !!!
2 is end !!!
3 is running...
4 is running...
3 is end !!!
4 is end !!!
5 is running...
6 is running...
5 is end !!!
6 is end !!!
1 is running...
2 is running...
2 is end !!!
1 is end !!!
3 is running...
4 is running...
4 is end !!!
3 is end !!!
5 is running...
6 is running...
종결 어
실제 프로젝트 에 서 는 스스로 new 를 통과 하 는 것 을 권장 합 니 다. Thread PoolExecutor 의 구조 방법 을 설정 하여 스 레 드 를 만 들 면 스 레 드 탱크 의 운행 규칙 을 더욱 명확 하 게 하고 자원 이 소모 되 지 않도록 하 며 위험 이 적 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.