標籤:logs turn zab 根據 schedule 非同步 來源 定時器 資源
// 建立可以容納3個線程的線程池 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, //core pool size nThreads, //maximum pool size 0L, //keep alive time TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
CachedThreadPool會建立一個緩衝區,將初始化的線程緩衝起來。會終止並且從緩衝中移除已有60秒未被使用的線程。
如果線程有可用的,就使用之前建立好的線程,
如果線程沒有可用的,就新建立線程。
任務是交替執行的
- 重用:緩衝型池子,先查看池中有沒有以前建立的線程,如果有,就reuse;如果沒有,就建一個新的線程加入池中
- 使用情境:緩衝型池子通常用於執行一些生存期很短的非同步型任務,因此在一些連線導向的daemon型SERVER中用得不多。
- 逾時:能reuse的線程,必須是timeout IDLE內的池中線程,預設timeout是60s,超過這個IDLE時間長度,線程執行個體將被終止及移出池。
- 結束:注意,放入CachedThreadPool的線程不必擔心其結束,超過TIMEOUT不活動,其會自動被終止。
// 線程池的大小會根據執行的任務數動態分配 ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, //core pool size Integer.MAX_VALUE, //maximum pool size 60L, //keep alive time TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
// 建立單個線程的線程池,如果當前線程在執行任務時突然中斷,則會建立一個新的線程替代它繼續執行任務 ExecutorService singleThreadPool = Executors.newSingleThreadExecutor(); public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, //core pool size 1, //maximum pool size 0L, //keep alive time TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); }
// 效果類似於Timer定時器 ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3); public ScheduledThreadPoolExecutor(int corePoolSize) { super(corePoolSize, //core pool size Integer.MAX_VALUE, //maximum pool size 0, //keep alive time TimeUnit.NANOSECONDS, new DelayedWorkQueue()); }
資料來源
http://blog.csdn.net/vking_wang/article/details/9619137
FixedThreadPool
在FixedThreadPool中,有一個固定大小的池。
如果當前需要執行的任務超過池大小,那麼多出的任務處於等待狀態,直到有空閑下來的線程執行任務,
如果當前需要執行的任務小於池大小,閒置線程也不會去銷毀。
- 重用:fixedThreadPool與cacheThreadPool差不多,也是能reuse就用,但不能隨時建新的線程
- 固定數目:其獨特之處在於,任意時間點,最多隻能有固定數目的活動線程存在,此時如果有新的線程要建立,只能放在另外的隊列中等待,直到當前的線程中某個線程終止直接被移出池子
- 逾時:和cacheThreadPool不同,FixedThreadPool沒有IDLE機制(可能也有,但既然文檔沒提,肯定非常長,類似依賴上層的TCP或UDP IDLE機制之類的),
- 使用情境:所以FixedThreadPool多數針對一些很穩定很固定的正規並發線程,多用於伺服器
- 源碼分析:從方法的原始碼看,cache池和fixed 池調用的是同一個底層池,只不過參數不同:
fixed池線程數固定,並且是0秒IDLE(無IDLE)
cache池線程數支援0-Integer.MAX_VALUE(顯然完全沒考慮主機的資源承受能力),60秒IDLE
Java線程池ExecutorService