FixedThreadPool
由Executors的newFixedThreadPool方法創建。它是一種線程數量固定的線程池,當線程處于空閑狀態時,他們并不會被回收,除非線程池被關閉。當所有的線程都處于活動狀態時,新的任務都會處于等待狀態,直到有線程空閑出來。FixedThreadPool只有核心線程,且該核心線程都不會被回收,這意味著它可以更快地響應外界的請求。
FixedThreadPool沒有額外線程,只存在核心線程,而且核心線程沒有超時機制,而且任務隊列沒有長度的限制。
public class ThreadPoolExecutorTest {public static void main(String[] args) {ExecutorService fixedThreadPool =Executors. newFixedThreadPool(3);for (int i =1; i<=5;i++){final int index=i ;fixedThreadPool.execute(new Runnable(){@Overridepublic void run() {try {System.out.println("第" +index + "個線程" +Thread.currentThread().getName());Thread.sleep(1000);} catch(InterruptedException e ) {e .printStackTrace();}}});}}
}
CachedThreadPool
由Executors的newCachedThreadPool方法創建,不存在核心線程,只存在數量不定的非核心線程,而且其數量最大值為Integer.MAX_VALUE。當線程池中的線程都處于活動時(全滿),線程池會創建新的線程來處理新的任務,否則就會利用新的線程來處理新的任務,線程池中的空閑線程都有超時機制,默認超時時長為60s,超過60s的空閑線程就會被回收。和FixedThreadPool不同的是,CachedThreadPool的任務隊列其實相當于一個空的集合,這將導致任何任務都會被執行,因為在這種場景下SynchronousQueue是不能插入任務的,SynchronousQueue是一個特殊的隊列,在很多情況下可以理解為一個無法儲存元素的隊列。從CachedThreadPool的特性看,這類線程比較適合執行大量耗時較小的任務。當整個線程池都處于閑置狀態時,線程池中的線程都會因為超時而被停止回收,幾乎是不占任何系統資源。
ScheduledThreadPool
通過Executors的newScheduledThreadPool方式創建,核心線程數量是固定的,而非核心線程是沒有限制的,并且當非核心線程閑置時它會被立即回收,ScheduledThreadPool這類線程池主要用于執行定時任務和具有固定時期的重復任務。
延遲:
public class ThreadPoolExecutorTest { public static void main(String[] args) {ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3); scheduledThreadPool.schedule(newRunnable(){ @Overridepublic void run() {System.out.println("延遲三秒");}}, 3, TimeUnit.SECONDS);}
}
定時:
public class ThreadPoolExecutorTest { public static void main(String[] args) {ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3); scheduledThreadPool.scheduleAtFixedRate(newRunnable(){ @Override public void run() {System.out.println("延遲1秒后每三秒執行一次");}},1,3,TimeUnit.SECONDS);}}
SingleThreadExecutor
通過Executors的newSingleThreadExecutor方法來創建。這類線程池內部只有一個核心線程,它確保所有的任務都在同一個線程中按順序執行。SingleThreadExecutor的意義在于統一所有外界任務一個線程中,這使得這些任務之間不需要處理線程同步的問題