【併發】Java線程池

線程池顧名思義就是指管理一組同構工作線程的資源池,線程池與工作隊列(Work Queue)密切相關,工作隊列中保存了所有等待執行的任務。線程池管理的線程的任務就是從工作隊列中獲取一個任務、執行任務,然後返回線程池並等待下一個任務。

 

一、線程池的優勢

1、減少線程的創建與銷燬所帶來的開銷,同時任務不需要等待線程創建的時間而可以直接執行,只要有空閒線程的話

2、減少空閒活躍線程所帶來的CPU資源浪費

3、可以防止過多線程佔用過多內存而導致OOM異常

 

二、Executor框架

Executor框架是JUC裏面對於構建靈活強大的異步任務執行框架提供基礎的類,將任務執行的主要抽象從Thread轉化成Executor,這樣做可以爲不同類型的任務提供多種不同類型的執行策略,並將人物的提交過程與執行過程解耦開來,並提供任務執行的整個生命週期過程的控制和監控等。

Executor接口源碼:

public interface Executor {
    void execute(Runnable command);
}

Executor接口源碼很簡單,就只是包含了一個execute函數,將任務用Runnable來表示。

Executor的主要作用就是創建線程來執行任務,但沒有提供相應的方法來結束線程,但JVM必須等待所有非守護線程全部終止後纔會退出,如果Executor創建的線程沒有辦法正常退出的話,JVM就無法結束。爲了解決這個問題,線程池中用擴展了Executor接口的ExecutorService來作爲任務執行的抽象,將Executor的執行分爲三個生命週期:運行、關閉和已終止,並提供一系列的方法來管理生命週期,以及一些用於提交任務的方法。

public interface ExecutorService extends Executor {
    void shutdown();    //平緩關閉線程池,不再接受新任務,同時等待已提交的任務執行完畢
    List<Runnable> shutdownNow();    //粗暴關閉線程池,嘗試取消所有運行中的人物,返回未開始的任務
    boolean isShutdown();    //判斷是否處於關閉狀態
    boolean isTerminated();    //判斷是否處於已終止狀態
    boolean awaitTermination(long timeout, TimeUnit unit)    //等待ExectorService到達終止狀態
        throws InterruptedException;
    <T> Future<T> submit(Callable<T> task);    //提交Callable任務
    <T> Future<T> submit(Runnable task, T result);    //提交Runnable任務,並將結果保存在result中
    Future<?> submit(Runnable task);    //提交Runnable任務並返回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;
    <T> T invokeAny(Collection<? extends Callable<T>> tasks,
                    long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

 

三、線程池的種類

Executors類中提供了多種不同類型的線程池以根據不同的運行環境、業務需求來處理不同類型的任務,這些線程池的創建主要就是調用ThreadPoolExecutor函數,通過調整不同的參數來創建不同類型的線程池,除了Executors提供的多種創建方式,還可以通過ThreadPoolExecutor函數來自定義線程池。

  • ThreadPoolExecutor
    public ThreadPoolExecutor(int corePoolSize,    //線程池基本大小
                              int maximumPoolSize,    //線程池最大大小
                              long keepAliveTime,    //存活時間(線程空閒允許的時間)
                              TimeUnit unit,    //線程等待時間
                              BlockingQueue<Runnable> workQueue,    //任務隊列
                              ThreadFactory threadFactory,    //線程工廠
                              RejectedExecutionHandler handler    //任務拒絕處理器) { ... }

 

1、newFixedThreadPool

創建固定大小的線程池,每當提交一個任務時就創建一個線程,直到達到最大數量,如果某個線程非正常結束,線程池就會補充一個新的線程。

    public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }

 

2、newWorkStealingPool

創建一個提供足夠縣城以支持給定的並行級別的線程池,可通過多個隊列來減少資源爭奪的情況,不保證提交任務的執行順序。

    public static ExecutorService newWorkStealingPool(int parallelism) {
        return new ForkJoinPool
            (parallelism,
             ForkJoinPool.defaultForkJoinWorkerThreadFactory,
             null, true);
    }

 

3、newSingleThreadExecutor

創建一個單線程的Executor,當這個線程非正常結束時會創建另一個線程來代替。

    public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

 

4、newCachedThreadPool

創建一個可緩存的線程池,理論上線程池沒有上限(Integer.MAX_VALUE),如果當前線程池的規模超過處理需求的時候,線程池就會自動回收空閒線程。

    public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

 

5、newSingleThreadScheduledExecutor

創建一個單線程的Executor用來處理以延遲或定時的方式來執行任務。

    public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
        return new DelegatedScheduledExecutorService
            (new ScheduledThreadPoolExecutor(1));
    }

 

6、newScheduledThreadPool

創建一個固定長度的線程池用來處理以延遲或定時的方式來執行任務。

    public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
        return new ScheduledThreadPoolExecutor(corePoolSize);
    }

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章