線程池簡介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:沒有具體使用過,後續使用了再具體添加