常見的四種線程池和區別
線程池能有效的處理多個線程的並發問題,避免大量的線程因為互相強占系統資源導致阻塞現象,能夠有效的降低頻繁創建和銷毀線程對性能所帶來的開銷。真正線程池的實現是通過ThreadPoolExecutor,ThreadPoolExecutor通過配置不同的參數配置來創建線程池。
下面簡單的介紹一下各個線程池的區別和用處。
(1)fixThreadPool 正規線程
我的理解這是一個有指定的線程數的線程池,有核心的線程,里面有固定的線程數量,響應的速度快。正規的並發線程,多用於服務器。固定的線程數由系統資源設置。
public static ExecutorService newFixedThreadPool(int threads)
{
return newFixedThreadPool(threads,threads,0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}
核心線程是沒有超時機制的,隊列大小沒有限制,除非線程池關閉了核心線程才會被回收。
(2)caCheThreadPool 緩存線程池
只有非核心線程,最大線程數很大(Int.Max(values)),它會為每一個任務添加一個新的線程,這邊有一個超時機制,當空閑的線程超過60s內沒有用到的話,就會被回收。缺點就是沒有考慮到系統的實際內存大小。
public static ExecutorService newCachedThreadPool(int threads)
{
return newFixedThreadPool(threads,Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());
}
(3)singleThreadPoll 單線程線程池
看這個名字就知道這個家伙是只有一個核心線程,就是一個孤家寡人,通過指定的順序將任務一個個丟到線程,都乖乖的排隊等待執行,不處理並發的操作,不會被回收。確定就是一個人干活效率慢。
(4)ScheduledThreadPoll
這個線程池就厲害了,是唯一一個有延遲執行和周期重復執行的線程池。它的核心線程池固定,非核心線程的數量沒有限制,但是閑置時會立即會被回收。