由Executors的newFixedThreadPool方法建立。它是一種線程數量固定的線程池,當線程處於空閒狀態時,他們並不會被回收,除非線程池被關閉。當全部的線程都處於活動狀態時,新的任務都會處於等待狀態,直到有線程空閒出來。FixedThreadPool只有核心線程,且該核心線程都不會被回收,這意味着它能夠更快地響應外界的請求。
FixedThreadPool沒有額外線程,只存在覈心線程,並且核心線程沒有超時機制,並且任務隊列沒有長度的限制。ide
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(){ @Override public void run() { try { System.out.println("第" +index + "個線程" +Thread.currentThread().getName()); Thread.sleep(1000); } catch(InterruptedException e ) { e .printStackTrace(); } } }); } } }
由Executors的newCachedThreadPool方法建立,不存在覈心線程,只存在數量不定的非核心線程,並且其數量最大值爲Integer.MAX_VALUE。當線程池中的線程都處於活動時(全滿),線程池會建立新的線程來處理新的任務,不然就會利用新的線程來處理新的任務,線程池中的空閒線程都有超時機制,默認超時時長爲60s,超過60s的空閒線程就會被回收。和FixedThreadPool不一樣的是,CachedThreadPool的任務隊列其實至關於一個空的集合,這將致使任何任務都會被執行,由於在這種場景下SynchronousQueue是不能插入任務的,SynchronousQueue是一個特殊的隊列,在不少狀況下能夠理解爲一個沒法儲存元素的隊列。從CachedThreadPool的特性看,這類線程比較適合執行大量耗時較小的任務。當整個線程池都處於閒置狀態時,線程池中的線程都會由於超時而被中止回收,幾乎是不佔任何系統資源。線程
經過Executors的newScheduledThreadPool方式建立,核心線程數量是固定的,而非核心線程是沒有限制的,而且當非核心線程閒置時它會被當即回收,ScheduledThreadPool這類線程池主要用於執行定時任務和具備固定時期的重複任務。
延遲:code
public class ThreadPoolExecutorTest { public static void main(String[] args) { ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3); scheduledThreadPool.schedule(newRunnable(){ @Override public 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); } }
經過Executors的newSingleThreadExecutor方法來建立。這類線程池內部只有一個核心線程,它確保全部的任務都在同一個線程中按順序執行。SingleThreadExecutor的意義在於統一全部外界任務一個線程中,這使得這些任務之間不須要處理線程同步的問題資源