자바 스 레 드 시리즈 스 레 드 탱크 깊이 분석 - 시스템 구조
8100 단어 자바
주: 자바 소스 코드 분석 부분 은 특별한 설명 이 없 으 면 자바 8 버 전 을 기반 으로 합 니 다.
간단 한 소개
자바 의 스 레 드 탱크 는 경골 이다. 스 레 드 탱크 의 소스 코드 에 대해 깊이 연구 하면 자바 전체 병행 프로 그래 밍 에 대한 이 해 를 높 일 뿐만 아니 라 면접 에서 의 자신의 표현 도 향상 시 켜 합격 가능성 을 높 일 수 있다.
이 시 리 즈 는 여러 장 으로 나 뉘 는데 이 장 은 스 레 드 탱크 의 제1장 으로 전체 스 레 드 탱크 체 계 를 총람 할 것 이다.
체계 구조
위의 그림 은 스 레 드 탱크 에서 매우 중요 한 인터페이스 와 종 류 를 열거 했다.
(1) Executor, 스 레 드 탱크 최고급 인터페이스;
(2) Executor Service, 스 레 드 탱크 2 차 인터페이스, Executor 에 대해 확장 을 하고 기능 을 추가 합 니 다.
(3) ScheduledExecutorService 는 ExecutorService 에 대해 확장 을 하고 정시 작업 과 관련 된 기능 을 추가 했다.
(4) AbstractExecutorService, 추상 류, 템 플 릿 방법 디자인 모델 을 활용 하여 일부 방법 을 실현 했다.
(5) Thread PoolExecutor, 일반 스 레 드 탱크 류 는 우리 가 흔히 말 하 는 스 레 드 탱크 로 가장 기본 적 인 스 레 드 탱크 작업 과 관련 된 방법 을 포함한다.
(6) ScheduledThreadPoolExecutor, 정시 작업 스 레 드 탱크 류 는 정시 작업 관련 기능 을 실현 하 는 데 사 용 됩 니 다.
(7) ForkJoinPool, 신형 스 레 드 탱크 류, java 7 에 추 가 된 스 레 드 탱크 류 는 작업 절취 이론 을 바탕 으로 실현 되 고 큰 임무 의 작은 임무, 임무 가 무한 한 장면 에 활용 된다.
(8) Executors, 스 레 드 탱크 도구 류 는 스 레 드 탱크 를 신속하게 실현 하 는 방법 (신중 한 사용) 을 정의 했다.
Executor
스 레 드 탱크 의 최상 위 인 터 페 이 스 는 반환 값 없 는 작업 을 수행 하 는 방법 만 정의 합 니 다.
public interface Executor {
// 【 “ ” 】
void execute(Runnable command);
}
ExecutorService
스 레 드 탱크 2 차 인 터 페 이 스 는 Executor 에 대해 확장 을 했 습 니 다. 주로 스 레 드 탱크 를 닫 고 반환 값 작업 을 수행 하 며 임 무 를 대량으로 수행 하 는 방법 을 추 가 했 습 니 다.
public interface ExecutorService extends Executor {
// , ,
void shutdown();
// , ,
//
List shutdownNow();
//
boolean isShutdown();
// , shutdown() shutdownNow() true
boolean isTerminated();
// true
boolean awaitTermination(long timeout, TimeUnit unit)
throws InterruptedException;
// , task.call()
Future submit(Callable task);
// , result
// get()
Future submit(Runnable task, T result);
// , null
// get()
Future> submit(Runnable task);
// ,
List> invokeAll(Collection extends Callable> tasks)
throws InterruptedException;
// ,
// timeout ,
List> invokeAll(Collection extends Callable> tasks,
long timeout, TimeUnit unit)
throws InterruptedException;
// ,
T invokeAny(Collection extends Callable> tasks)
throws InterruptedException, ExecutionException;
// , ,
T invokeAny(Collection extends Callable> tasks,
long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException;
}
ScheduledExecutorService
Executor Service 에 대해 확장 을 하고 정시 작업 과 관련 된 기능 을 추 가 했 습 니 다. 주로 두 가지 유형 을 포함 합 니 다. 한 번 실행 하고 여러 번 반복 합 니 다.
public interface ScheduledExecutorService extends ExecutorService {
//
public ScheduledFuture> schedule(Runnable command,
long delay, TimeUnit unit);
//
public ScheduledFuture schedule(Callable callable,
long delay, TimeUnit unit);
// , ( )
// 【 “ ” 】
public ScheduledFuture> scheduleAtFixedRate(Runnable command,
long initialDelay,
long period,
TimeUnit unit);
// , ( )
//
public ScheduledFuture> scheduleWithFixedDelay(Runnable command,
long initialDelay,
long delay,
TimeUnit unit);
}
AbstractExecutorService
추상 류 는 템 플 릿 방법 디자인 모델 을 활용 하여 일부 방법 을 실 현 했 는데 주로 반환 값 임 무 를 수행 하고 임 무 를 대량으로 수행 하 는 방법 이다.
public abstract class AbstractExecutorService implements ExecutorService {
protected RunnableFuture newTaskFor(Runnable runnable, T value) {
return new FutureTask(runnable, value);
}
protected RunnableFuture newTaskFor(Callable callable) {
return new FutureTask(callable);
}
public Future> submit(Runnable task) {
if (task == null) throw new NullPointerException();
RunnableFuture ftask = newTaskFor(task, null);
execute(ftask);
return ftask;
}
public Future submit(Runnable task, T result) {
if (task == null) throw new NullPointerException();
RunnableFuture ftask = newTaskFor(task, result);
execute(ftask);
return ftask;
}
public Future submit(Callable task) {
if (task == null) throw new NullPointerException();
RunnableFuture ftask = newTaskFor(task);
execute(ftask);
return ftask;
}
public T invokeAny(Collection extends Callable> tasks)
throws InterruptedException, ExecutionException {
// ...
}
public T invokeAny(Collection extends Callable> tasks,
long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException, TimeoutException {
// ...
}
public List> invokeAll(Collection extends Callable> tasks)
throws InterruptedException {
// ...
}
public List> invokeAll(Collection extends Callable> tasks,
long timeout, TimeUnit unit)
throws InterruptedException {
// ...
}
}
이곳 의 submit () 방법 은 들 어 오 는 미 션 을 모두 Future Task 로 포장 하여 처리 하 는 것 을 볼 수 있 습 니 다. 이것 은 무엇 입 니까?뒷부분 에 주목 해 주세요.
ThreadPoolExecutor
일반 스 레 드 탱크 류 는 우리 가 흔히 말 하 는 스 레 드 탱크 로 가장 기본 적 인 스 레 드 탱크 작업 과 관련 된 방법 을 포함한다.
스 레 드 탱크 의 주요 실현 논 리 는 모두 이 안에 있 습 니 다. 예 를 들 어 스 레 드 의 생 성, 작업 의 처리, 거부 전략 등 이 있 습 니 다. 우 리 는 뒤에 이런 종 류 를 따로 분석 합 니 다.
ScheduledThreadPoolExecutor
정시 작업 스 레 드 탱크 류 는 정시 작업 과 관련 된 기능 을 실현 하고 임 무 를 정시 작업 으로 포장 하 며 정시 전략 에 따라 집행 합 니 다. 우 리 는 뒤에서 이 종 류 를 단독으로 분석 합 니 다.
문제: 정시 작업 스 레 드 탱크 류 가 사용 하 는 대기 열 이 무엇 인지 아 십 니까?
ForkJoinPool
새로운 스 레 드 탱크 류, 자바 7 에 추 가 된 스 레 드 탱크 류, 이 스 레 드 탱크 는 Go 의 스 레 드 모델 과 매우 유사 합 니 다. 모두 작업 절취 이론 을 바탕 으로 하 는 것 으로 먼저 분 리 된 장면 을 처리 하고 정렬 하 는 데 특히 적합 합 니 다.
Executors
스 레 드 탱크 도구 류 는 스 레 드 탱크 를 신속하게 실현 하 는 일련의 방법 인 new XXX () 를 정 의 했 습 니 다. 그러나 아 리 매 뉴 얼 은 이런 종 류 를 사용 하여 스 레 드 탱크 를 새로 만 드 는 것 을 권장 하지 않 습 니 다. 동 형 은 그렇게 생각 하지 않 습 니 다. 그 소스 코드 를 파악 할 수만 있다 면 그 이익 이 가끔 사용 할 수 있다 는 것 을 알 고 나중에 우리 가 다시 이 일 을 이야기 하 겠 습 니 다.
달걀
달걀 이 없 으 면 즐 겁 지 않 습 니 다. 오늘 의 문 제 는 정시 임무 스 레 드 탱크 가 어떤 대열 로 이 루어 지 느 냐 하 는 것 입 니 다.
답: 지연 대기 열.정시 작업 스 레 드 탱크 에 서 는 병렬 집합 중의 Delay Queue 를 직접 사용 하지 않 고 자신 이 Delayed WorkQueue 를 실현 하 였 으 나 Delay Queue 의 실현 원리 와 같다.
지연 대기 열 은 어떤 데이터 구 조 를 사용 하여 이 루어 집 니까?
답: 더미 (DelayQueue 에 서 는 우선 순위 대기 열 을 사용 하고 우선 순위 대기 열 에 서 는 더미, Delayed WorkQueue 가 직접 사용 하 는 더미).
지연 대기 열, 우선 순위 대기 열, 더미 에 관 한 내용 은 아래 링크 를 클릭 하여 직통 합 니 다.
자바 집합 Delay Queue 소스 분석
자바 집합 Priority Queue 소스 분석
제발 면접 에서 더 이상 나 에 게 묻 지 마 세 요.
제 공식 번호 인 '동 형 이 소스 코드 를 읽 습 니 다' 를 주목 하고 더 많은 소스 시리즈 글 을 조회 하 며 동 형 과 함께 소스 코드 의 바 다 를 마음껏 유람 하 는 것 을 환영 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.