자바 스 레 드 시리즈 스 레 드 탱크 깊이 분석 - 시스템 구조

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 소스 분석
제발 면접 에서 더 이상 나 에 게 묻 지 마 세 요.
제 공식 번호 인 '동 형 이 소스 코드 를 읽 습 니 다' 를 주목 하고 더 많은 소스 시리즈 글 을 조회 하 며 동 형 과 함께 소스 코드 의 바 다 를 마음껏 유람 하 는 것 을 환영 합 니 다.

좋은 웹페이지 즐겨찾기