java中的線程池類有兩個,分别是:threadpoolexecutor和scheduledthreadpoolexecutor,這兩個類都繼承自executorservice。利用這兩個類,可以建立各種不同的java線程池,為了友善我們建立線程池,java api提供了executors工廠類來幫助我們建立各種各樣的線程池。下面我們分别介紹一下這三個類。
java線程池executorservice繼承樹:

threadpoolexecutor是executorservice的一個實作類,也是java中最常用的線程池類。threadpoolexecutor内部維持了一個線程池,可以執行給定的任務,下面是關于它的具體使用方法。
threadpoolexecutor源碼中的構造方法:
threadpoolexecutor線程池中的線程數量是可變的,其變化範圍取決于下面兩個變量:
具體線程的配置設定方式是,當一個任務被添加到線程池:
這樣,線程池可以動态的調整池中的線程數。除了<code>corepoolsize</code>、<code>maximumpoolsize</code>兩個變量外,threadpoolexecutor構造方法還有幾個參數:
unit 可選的參數為<code>java.util.concurrent.timeunit</code>中的幾個靜态屬性:
workqueue是一個blockingqueue,預設是<code>linkedblockingqueue<runnable></code>
handler 是線程池拒絕處理任務的方式,主要有四種類型:
threadpoolexecutor.abortpolicy()(系統預設):抛出java.util.concurrent.rejectedexecutionexception異常
threadpoolexecutor.callerrunspolicy():當抛出rejectedexecutionexception異常時,會調用rejectedexecution方法
threadpoolexecutor.discardoldestpolicy():抛棄舊的任務
threadpoolexecutor.discardpolicy():抛棄目前的任務
scheduledthreadpoolexecutor是executorservice的另一個實作類,從上面java線程池executorservice繼承樹這幅圖可以看出,scheduledthreadpoolexecutor直接繼承自scheduledexecutorservice,scheduledthreadpoolexecutor 類的功能也主要展現在scheduledexecutorservice 接口上,而是以在介紹scheduledthreadpoolexecutor之前先介紹一下scheduledexecutorservice接口。
<code>java.util.concurrent.scheduledexecutorservice</code>接口繼承了executorservice,它的最主要的功能就是可以對其中的任務進行排程,比如延遲執行、定時執行等等。
scheduledexecutorservice接口定義:
從上面接口定義我們知道,提供了四個方法,下面我們就分别介紹:
這個方法的意思是在指定延遲之後運作task。這個方法有個問題,就是沒有辦法獲知task的執行結果。如果我們想獲得task的執行結果,我們可以傳入一個callable的執行個體(後面會介紹)。
這個方法與<code>schedule (runnable task)</code>類似,也是在指定延遲之後運作task,不過它接收的是一個callable執行個體,此方法會傳回一個schedulefuture對象,通過schedulefuture我們可以取消一個未執行的task,也可以獲得這個task的執行結果。
這個方法的作用是周期性的排程task執行。task第一次執行的延遲根據<code>initialdelay</code>參數确定,以後每一次執行都間隔<code>period</code>時長。
如果task的執行時間大于定義的period,那麼下一個線程将在目前線程完成之後再執行。整個排程保證不會出現一個以上任務同時執行。
schedulewithfixeddelay的參數和scheduleatfixedrate參數完全一緻,它們的不同之處在于對period排程周期的解釋。
在scheduleatfixedrate中,period指的兩個任務開始執行的時間間隔,也就是目前任務的開始執行時間和下個任務的開始執行時間之間的間隔。
而在schedulewithfixeddelay中,period指的目前任務的結束執行時間到下個任務的開始執行時間。
和executorservice類似, 我們在使用完scheduledexecutorservice時需要關閉它。如果不關閉的話,jvm會一直運作直,即使所有線程已經關閉了。
關閉scheduledexecutorservice可以使用其繼承自executorservice接口的<code>shutdown()</code>和<code>shutdownnow()</code>方法,兩者的差別請參考【java線程池 executorservice】。
scheduledthreadpoolexecutor繼承自threadpoolexecutor,構造參數很簡單,隻有3個:
具體使用方法請參考threadpoolexecutor或者使用executors。
建立一個什麼樣的executorservice的執行個體(即線程池)需要我們的具體應用場景而定,不過java給我們提供了一個executors工廠類,它可以幫助我們很友善的建立各種類型executorservice線程池,executors一共可以建立下面這四類線程池:
備注:executors隻是一個工廠類,它所有的方法傳回的都是threadpoolexecutor、scheduledthreadpoolexecutor這兩個類的執行個體。
閱讀完本文強烈建議閱讀一下【java線程池 executorservice】。