【初識】-JUC·Executor框架

glmapper發表於2018-02-06

前言

多執行緒和併發這兩個東西真的是嚮往已久,總是有一種神祕的感覺,想去探索一波,又擔心水平不夠無法駕馭。想以讀書筆記的方式來寫,但是又覺得缺少自己的一些思考;但是在沒有足夠併發程式設計經驗的情況下又沒法去寫出很深刻的東西,畢竟沒有踩過坑。所以在閱讀spring原始碼的同時,也想抽點時間來看一看JUC的東西,關於這塊只能說是記錄自己學習JUC的一個過程,嘗試用一些具體的程式碼demo來加深理解。所以就把本系列寫成《【 初識】-JUC·XXXX》,用來讓自己開啟併發程式設計的大門。

JUC

JUC即java.util.concurrent;也就是java提供的併發包。JUC中從包結構上來看主要是:

  • java.util.concurrent

    在這個包下面主要是執行緒池、併發集合以及一些併發工具類。執行緒池相關是圍繞Excetor框架來構建;這也是本文下面部分的重點。

  • java.util.concurrent.atomic

    這個包下面是一些原子操作類,算是併發輔助工具類,基本實現依賴於CAS;

  • java.util.concurrent.locks

    這個從名字就可以知道它的作用,就是提供鎖。

JUC各個模組的類

  • 整體框架

【初識】-JUC·Executor框架

  • atomic

【初識】-JUC·Executor框架

  • locks

【初識】-JUC·Executor框架

  • 併發集合

【初識】-JUC·Executor框架

  • 併發工具

【初識】-JUC·Executor框架

  • forkJoin

    fork-join在JUC中有下面三個類:

    public class ForkJoinPool extends AbstractExecutorService
    複製程式碼
    public abstract class ForkJoinTask<V> implements Future<V>, Serializable
    複製程式碼
    public class ForkJoinWorkerThread extends Thread
    複製程式碼

Future

Future提供了可以獲取非同步執行結果的方法,區別於Runnable的run方法,run是不提供返回結果的。

public interface Future<V> {
    //取消
    boolean cancel(boolean mayInterruptIfRunning);
    //如果任務完成前被取消,則返回true。
    boolean isCancelled();
    //如果任務執行結束,無論是正常結束或是中途取消還是發生異常,都返回true。
    boolean isDone();
    //獲取非同步執行的結果,如果沒有結果可用,此方法會阻塞直到非同步計算完成。
    V get() throws InterruptedException, ExecutionException;
    //獲取非同步執行結果,如果沒有結果可用,此方法會阻塞,但是會有時間限制,
    //如果阻塞時間超過設定的timeout時間,該方法將丟擲異常。
    V get(long timeout, TimeUnit unit) throws InterruptedException, 
    ExecutionException, TimeoutException;
}
複製程式碼

Callable

宣告瞭一個名稱為call()的方法,同時這個方法可以有返回值V,也可以丟擲異常

public interface Callable<V> { 
  V   call()   throws Exception; 
} 
複製程式碼

關於Callable和Future的使用一般情況下都是結合我們的執行緒池來使用的。

Executor

Executor介面是執行緒池實現的頂級介面,其和spring中的BeanFactory所承擔的角色差不多,就是提供頂級的功能約束,具體實現交於不同子類來完成。

public interface Executor {
    /**
     * Executes the given command at some time in the future.  The command
     * may execute in a new thread, in a pooled thread, or in the calling
     * thread, at the discretion of the <tt>Executor</tt> implementation.
     *
     * @param command the runnable task
     * @throws RejectedExecutionException if this task cannot be
     * accepted for execution.
     * @throws NullPointerException if command is null
     */
    void execute(Runnable command);
}
複製程式碼

下面是JUC中Executor框架的整體結構:

【初識】-JUC·Executor框架

ExecutorService

public interface ExecutorService extends Executor {
    //關閉執行緒池
    void shutdown();
    
    List<Runnable> shutdownNow();
    //是否為Shutdown狀態
    boolean isShutdown();
    //是否為Terminated狀態
    boolean isTerminated();
    
    //超過超時時間時,會監測ExecutorService是否已經關閉
    //若關閉則返回true,否則返回false。
    //一般情況下會和shutdown方法組合使用。
    boolean awaitTermination(long timeout, TimeUnit unit)
        throws InterruptedException;
    
    //返回一個Future物件,引數接收的是一個Callable的實現
    //Callable介面中的call()方法有一個返回值,可以返回任務的執行結果
    //區別於Runnable介面中的run()方法(void修飾,沒有返回值)。
    <T> Future<T> submit(Callable<T> task);
    
    <T> Future<T> submit(Runnable task, T result);
    //返回一個Future物件,通過返回的Future物件,我們可以檢查提交的任務是否執行完成了。 
    Future<?> submit(Runnable task);
    
    //返回一個Future的List,其中對應著每個Callable任務執行後的Future物件。
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
        throws InterruptedException;
    //增加了超時控制    
    <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks,
                                  long timeout, TimeUnit unit)
        throws InterruptedException;
        
        
    //接收引數是一個Callable的集合,
    //返回的是所有Callable集合任務中某一個任務的執行結果
    <T> T invokeAny(Collection<? extends Callable<T>> tasks)
        throws InterruptedException, ExecutionException;
    //增加了超時控制
    <T> T invokeAny(Collection<? extends Callable<T>> tasks,
                    long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}
複製程式碼

ExecutorService 再Executor介面的基礎上擴充套件了對執行緒池狀態的控制以及提交任務執行的超時控制。執行緒池的基本功能還不夠完善,不能真正的具備處理具體業務的能力(畢竟是個介面,O(∩_∩)O哈哈~)。

開個篇,慢慢學~

相關文章