歡迎光臨
每天分享高質量文章

【死磕Java併發】—–J.U.C之執行緒池:執行緒池的基礎架構

原文出處http://cmsblogs.com/ 『chenssy

經歷了Java記憶體模型、JUC基礎之AQS、CAS、Lock、併發工具類、併發容器、阻塞佇列、atomic類後,我們開始JUC的最後一部分:執行緒池。在這個部分你將瞭解到下麵幾個部分:

  1. 執行緒池的基礎架構

  2. 執行緒池的原理分析

  3. 執行緒池核心類的原始碼分析

  4. 執行緒池調優

Executor

我們先看執行緒池的基礎架構圖:

Executor

Executor,任務的執行者,執行緒池框架中幾乎所有類都直接或者間接實現Executor介面,它是執行緒池框架的基礎。Executor提供了一種將“任務提交”與“任務執行”分離開來的機制,它僅提供了一個Execute()方法用來執行已經提交的Runnable任務。

  1. public interface Executor {

  2.    void execute(Runnable command);

  3. }

ExcutorService

繼承Executor,它是“執行者服務”介面,它是為”執行者介面Executor”服務而存在的。準確的地說,ExecutorService提供了”將任務提交給執行者的介面(submit方法)”,”讓執行者執行任務(invokeAll, invokeAny方法)”的介面等等。

  1. public interface ExecutorService extends Executor {

  2.    /**

  3.     * 啟動一次順序關閉,執行以前提交的任務,但不接受新任務

  4.     */

  5.    void shutdown();

  6.    /**

  7.     * 試圖停止所有正在執行的活動任務,暫停處理正在等待的任務,並傳回等待執行的任務串列

  8.     */

  9.    List<Runnable> shutdownNow();

  10.    /**

  11.     * 如果此執行程式已關閉,則傳回 true。

  12.     */

  13.    boolean isShutdown();

  14.    /**

  15.     * 如果關閉後所有任務都已完成,則傳回 true

  16.     */

  17.    boolean isTerminated();

  18.    /**

  19.     * 請求關閉、發生超時或者當前執行緒中斷,無論哪一個首先發生之後,都將導致阻塞,直到所有任務完成執行

  20.     */

  21.    boolean awaitTermination(long timeout, TimeUnit unit)

  22.        throws InterruptedException;

  23.    /**

  24.     * 提交一個傳回值的任務用於執行,傳回一個表示任務的未決結果的 Future

  25.     */

  26.    <T> Future<T> submit(Callable<T> task);

  27.    /**

  28.     * 提交一個 Runnable 任務用於執行,並傳回一個表示該任務的 Future

  29.     */

  30.    <T> Future<T> submit(Runnable task, T result);

  31.    /**

  32.     * 提交一個 Runnable 任務用於執行,並傳回一個表示該任務的 Future

  33.     */

  34.    Future> submit(Runnable task);

  35.    /**

  36.     * 執行給定的任務,當所有任務完成時,傳回保持任務狀態和結果的 Future 串列

  37.     */

  38.    <T> List<Future<T>> invokeAll(Collection extends Callable<T>> tasks)

  39.        throws InterruptedException;

  40.    /**

  41.     * 執行給定的任務,當所有任務完成或超時期滿時(無論哪個首先發生),傳回保持任務狀態和結果的 Future 串列

  42.     */

  43.    <T> List<Future<T>> invokeAll(Collection extends Callable<T>> tasks,

  44.                                  long timeout, TimeUnit unit)

  45.        throws InterruptedException;

  46.    /**

  47.     * 執行給定的任務,如果某個任務已成功完成(也就是未丟擲異常),則傳回其結果

  48.     */

  49.    <T> T invokeAny(Collection extends Callable<T>> tasks)

  50.        throws InterruptedException, ExecutionException;

  51.    /**

  52.     * 執行給定的任務,如果在給定的超時期滿前某個任務已成功完成(也就是未丟擲異常),則傳回其結果

  53.     */

  54.    <T> T invokeAny(Collection extends Callable<T>> tasks,

  55.                    long timeout, TimeUnit unit)

  56.        throws InterruptedException, ExecutionException, TimeoutException;

  57. }

AbstractExecutorService

抽象類,實現ExecutorService介面,為其提供預設實現。AbstractExecutorService除了實現ExecutorService介面外,還提供了newTaskFor()方法傳回一個RunnableFuture,在執行的時候,它將呼叫底層可呼叫任務,作為 Future 任務,它將生成可呼叫的結果作為其結果,併為底層任務提供取消操作。

ScheduledExecutorService

繼承ExcutorService,為一個“延遲”和“定期執行”的ExecutorService。他提供了一些如下幾個方法安排任務在給定的延時執行或者週期性執行。

  1. // 建立並執行在給定延遲後啟用的 ScheduledFuture。

  2. <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)

  3. // 建立並執行在給定延遲後啟用的一次性操作。

  4. ScheduledFuture> schedule(Runnable command, long delay, TimeUnit unit)

  5. // 建立並執行一個在給定初始延遲後首次啟用的定期操作,後續操作具有給定的週期;

  6. //也就是將在 initialDelay 後開始執行,然後在 initialDelay+period 後執行,接著在 initialDelay + 2 * period 後執行,依此類推。

  7. ScheduledFuture> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)

  8. // 建立並執行一個在給定初始延遲後首次啟用的定期操作,隨後,在每一次執行終止和下一次執行開始之間都存在給定的延遲。

  9. ScheduledFuture> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)

ThreadPoolExecutor

大名鼎鼎的“執行緒池”,後續做詳細介紹。

ScheduledThreadPoolExecutor

ScheduledThreadPoolExecutor繼承ThreadPoolExecutor並且實現ScheduledExecutorService介面,是兩者的集大成者,相當於提供了“延遲”和“週期執行”功能的ThreadPoolExecutor。

Executors

靜態工廠類,提供了Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 、Callable 等類的靜態工廠方法,透過這些工廠方法我們可以得到相對應的物件。

  1. 建立並傳回設定有常用配置字串的 ExecutorService 的方法。

  2. 建立並傳回設定有常用配置字串的 ScheduledExecutorService 的方法。

  3. 建立並傳回“包裝的”ExecutorService 方法,它透過使特定於實現的方法不可訪問來禁用重新配置。

  4. 建立並傳回 ThreadFactory 的方法,它可將新建立的執行緒設定為已知的狀態。

  5. 建立並傳回非閉包形式的 Callable 的方法,這樣可將其用於需要 Callable 的執行方法中。

Future

Future介面和實現Future介面的FutureTask代表了執行緒池的非同步計算結果。

AbstractExecutorService提供了newTaskFor()方法傳回一個RunnableFuture,除此之外當我們把一個Runnable或者Callable提交給(submit())ThreadPoolExecutor或者ScheduledThreadPoolExecutor時,他們則會向我們傳回一個FutureTask物件。如下:

  1.    protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {

  2.        return new FutureTask<T>(runnable, value);

  3.    }

  4.        protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {

  5.        return new FutureTask<T>(callable);

  6.    }

  7.    <T> Future<T> submit(Callable<T> task)

  8.    <T> Future<T> submit(Runnable task, T result)

  9.    Future<> submit(Runnable task)

Future

作為非同步計算的頂層介面,Future對具體的Runnable或者Callable任務提供了三種操作:執行任務的取消、查詢任務是否完成、獲取任務的執行結果。其介面定義如下:

  1. public interface Future<V> {

  2.    /**

  3.     * 試圖取消對此任務的執行

  4.     * 如果任務已完成、或已取消,或者由於某些其他原因而無法取消,則此嘗試將失敗。

  5.     * 當呼叫 cancel 時,如果呼叫成功,而此任務尚未啟動,則此任務將永不執行。

  6.     * 如果任務已經啟動,則 mayInterruptIfRunning 引數確定是否應該以試圖停止任務的方式來中斷執行此任務的執行緒

  7.     */

  8.    boolean cancel(boolean mayInterruptIfRunning);

  9.    /**

  10.     * 如果在任務正常完成前將其取消,則傳回 true

  11.     */

  12.    boolean isCancelled();

  13.    /**

  14.     * 如果任務已完成,則傳回 true

  15.     */

  16.    boolean isDone();

  17.    /**

  18.     *   如有必要,等待計算完成,然後獲取其結果

  19.     */

  20.    V get() throws InterruptedException, ExecutionException;

  21.    /**

  22.     * 如有必要,最多等待為使計算完成所給定的時間之後,獲取其結果(如果結果可用)

  23.     */

  24.    V get(long timeout, TimeUnit unit)

  25.        throws InterruptedException, ExecutionException, TimeoutException;

  26. }

RunnableFuture

繼承Future、Runnable兩個介面,為兩者的合體,即所謂的Runnable的Future。提供了一個run()方法可以完成Future並允許訪問其結果。

  1. public interface RunnableFuture<V> extends Runnable, Future<V> {

  2.    //在未被取消的情況下,將此 Future 設定為計算的結果

  3.    void run();

  4. }

FutureTask

實現RunnableFuture介面,既可以作為Runnable被執行,也可以作為Future得到Callable的傳回值。

END

贊(0)

分享創造快樂

© 2024 知識星球   網站地圖