天天看點

[Java線程] Java線程池ExecutorService

CachedThreadPool會建立一個緩存區,将初始化的線程緩存起來。會終止并且從緩存中移除已有60秒未被使用的線程。

如果線程有可用的,就使用之前建立好的線程,

如果線程沒有可用的,就新建立線程。

重用:緩存型池子,先檢視池中有沒有以前建立的線程,如果有,就reuse;如果沒有,就建一個新的線程加入池中

使用場景:緩存型池子通常用于執行一些生存期很短的異步型任務,是以在一些面向連接配接的daemon型SERVER中用得不多。

逾時:能reuse的線程,必須是timeout IDLE内的池中線程,預設timeout是60s,超過這個IDLE時長,線程執行個體将被終止及移出池。

結束:注意,放入CachedThreadPool的線程不必擔心其結束,超過TIMEOUT不活動,其會自動被終止。

執行結果:

4個任務是交替執行的。

在FixedThreadPool中,有一個固定大小的池。

如果目前需要執行的任務超過池大小,那麼多出的任務處于等待狀态,直到有空閑下來的線程執行任務,

如果目前需要執行的任務小于池大小,空閑的線程也不會去銷毀。

重用:fixedThreadPool與cacheThreadPool差不多,也是能reuse就用,但不能随時建新的線程

固定數目:其獨特之處在于,任意時間點,最多隻能有固定數目的活動線程存在,此時如果有新的線程要建立,隻能放在另外的隊列中等待,直到目前的線程中某個線程終止直接被移出池子

逾時:和cacheThreadPool不同,FixedThreadPool沒有IDLE機制(可能也有,但既然文檔沒提,肯定非常長,類似依賴上層的TCP或UDP IDLE機制之類的),

使用場景:是以FixedThreadPool多數針對一些很穩定很固定的正規并發線程,多用于伺服器

源碼分析:從方法的源代碼看,cache池和fixed 池調用的是同一個底層池,隻不過參數不同:

fixed池線程數固定,并且是0秒IDLE(無IDLE)

cache池線程數支援0-Integer.MAX_VALUE(顯然完全沒考慮主機的資源承受能力),60秒IDLE

建立了一個固定大小的線程池,容量為3,然後循環執行了4個任務。由輸出結果可以看到,

前3個任務首先執行完,然後空閑下來的線程去執行第4個任務。

SingleThreadExecutor得到的是一個單個的線程,這個線程會保證你的任務執行完成。

如果目前線程意外終止,會建立一個新線程繼續執行任務,這和我們直接建立線程不同,也和newFixedThreadPool(1)不同。

4個任務是順序執行的。

ScheduledThreadPool是一個固定大小的線程池,與FixedThreadPool類似,執行的任務是定時執行。

——與FixedThreadPool的差別?