(Java 多線程系列)Java 線程池(Executor)

線程池簡介java


   線程池是指管理同一組同構工做線程的資源池,線程池是與工做隊列(Work Queue)密切相關的,其中在工做隊列中保存了全部等待執行的任務。工做線程(Worker Thread)的任務很簡單:從工做隊列中獲取一個任務,執行任務,而後返回線程池並等待下一個任務。緩存

  線程池簡化了線程管理工做,而且java.util.concurrent提供了一種靈活的線程池實現做爲Executor框架的一部分。在Java類庫中,任務執行的主要抽象不是Thread,而是Executor。雖然Executor是個簡單的接口,但它卻爲靈活且強大的異步任務執行框架提供了基礎,訪框架能支持多種不一樣類型的任務執行策略。它提供了一種標準的方法將任務的提交過程與執行過程解耦出來,並用Runnable來表示任務。框架

  因爲Java類庫中有Executor來專門用於線程池的管理的類,因此能夠用Executor任務執行框架來實現線程池的構建。異步

  Executor基於生產者-消費者模式,提交任務的操做至關於生產者(生成待完成工做單元),執行任務至關於消費者(執行完這個工做單元).基本框架爲:spa

 (此圖片轉載自http://computerdragon.blog.51cto.com/6235984/1212442)線程

 

線程池的建立3d


能夠經過調用Executors中的靜態工廠方法之一來建立一個線程池:code

  public static ExecutorService newFixedThreadPool(int nThreads)
    建立固定數目線程的線程池,每當提交一個任務時就建立一個線程,直到達到線程池的最大數量,這時線程池的規模將不會再變化(若是某個線程因爲發生的Exception而結束,那麼線程池會補充一個新的線程)
  public static ExecutorService newCachedThreadPool()
    建立一個可緩存的線程池,調用execute 將重用之前構造的線程(若是線程可用)。若是現有線程沒有可用的,則建立一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鐘未被使用的線程。
  public static ExecutorService newSingleThreadExecutor()
    建立一個單線程化的Executor。
  public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
    建立一個固定長度的線程池,並且以延遲或定時的方式來執行任務,相似於Timer。
blog

 

Executor的生命週期接口


 

  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) throws InterruptedException; //....
}

 

  ExecutorService的生命週期有3種運行狀態:運行、關閉和已終止。ExecutorService在初始建立時處於運行狀態。shutdown方法將執行平緩的關閉過程:再也不接受新的任務,同時等待已經提交的任務執行完成(包括那些還未開始執行的任務)。shutdownNow方法將執行粗暴的關閉過程:它嘗試取消全部運行中的任務,而且再也不啓動運行隊列中還沒有開始執行的任務。

  等全部任務都完成後,ExecutorService將轉入終止狀態。能夠調用awaitTermination()來等待ExecutorService到達終止狀態,或者經過來輪詢ExecutorService是否已經終止。經過在調用awaitTermination以後會當即調用shutdown,從而產生同步地關閉ExecutorService的效果。

  若是要使用Executor,必須將任務表述爲一個Runnable。

 

PS:沒有具體使用過,後續使用了再具體添加

相關文章
相關標籤/搜索