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

【死磕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)

分享創造快樂

© 2020 知識星球   网站地图