歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Java線程池框架源碼分析

相關類Executor,Executors,AbstractExecutorService,ExecutorService

Executor:整個線程池執行者框架的頂層接口。定義了一個execute方法,整個線程執行者框架的核心方法。

public interface Executor {

    void execute(Runnable command);
}

ExecutorService:這是一個接口它繼承自Executor,定義了shutdown,shutdownNow,awaitTermination,submit,invokeAll等方法。

AbstractExecutorService:實現了ExecutorService接口中的submit,invokeAll的方法。

  public Future<?> submit(Runnable task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<Void> ftask = newTaskFor(task, null);
        execute(ftask);
        return ftask;
    }

    public <T> Future<T> submit(Runnable task, T result) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task, result);
        execute(ftask);
        return ftask;
    }


    public <T> Future<T> submit(Callable<T> task) {
        if (task == null) throw new NullPointerException();
        RunnableFuture<T> ftask = newTaskFor(task);
        execute(ftask);
        return ftask;
    }

在這裡,所有submit方法提交的任務最終還是調用了execute方法,execute是接口Executor中定義的方法,AbstractExecutorService沒有實現它,

需要子類去實現這個方法,ThreadPoolExecutor繼承了AbstractExecutorService,它實現了execute方法。ScheduledThreadPoolExecutor繼承自

ThreadPoolExecutor,並覆蓋了ThreadPoolExecutor的execute方法。這個方法是線程執行框者架的核心邏輯,不同的線程池執行者有不同的實現邏輯。

AbstractExecutorService的功能較為簡單,實現了不同參數的submit,invokeAll方法。

ThreadPoolExecutor線程池執行者:它有一個核心的成員變量:

private final HashSet<Worker> workers = new HashSet<Worker>();

workers可以看做是ThreadPoolExecutor中用於運行任務的線程池。

worker是一個封裝了一個Thread對象並實現了Runnable接口的類。封裝Thread很容易理解,因為它要利用Thread去運行execute方法提交過來的runnable任務,但是為什麼會繼承runnable接口呢?

--------------------------------------分割線 --------------------------------------

大話設計模式(帶目錄完整版) PDF+源代碼 http://www.linuxidc.com/Linux/2014-08/105152.htm

Java中介者設計模式 http://www.linuxidc.com/Linux/2014-07/104319.htm

Java 設計模式之模板方法開發中應用 http://www.linuxidc.com/Linux/2014-07/104318.htm

設計模式之 Java 中的單例模式(Singleton) http://www.linuxidc.com/Linux/2014-06/103542.htm

跟JBPM學習設計模式 http://www.linuxidc.com/Linux/2014-06/102861.htm

--------------------------------------分割線 --------------------------------------

下面是剔除了部分代碼的Worker源碼:

  private final class Worker
        extends AbstractQueuedSynchronizer
        implements Runnable
    {
      final Thread thread;
       
        Runnable firstTask;

        Worker(Runnable firstTask) {
            setState(-1);
            this.firstTask = firstTask;
            this.thread = getThreadFactory().newThread(this);
        }

        public void run() {
            runWorker(this);
        }


    }

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-11/108791p2.htm

Copyright © Linux教程網 All Rights Reserved