Java通過Executors提供四種線程池,分別爲:
- newCachedThreadPool
創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閒線程,若無可回收,則新建線程。
- newFixedThreadPool
創建一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待。
- newScheduledThreadPool
創建一個定長線程池,支持定時及週期性任務執行。
- newSingleThreadExecutor
創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。
newFixedThreadPool
//定長線程池 ExecutorService threadPoolService = Executors.newFixedThreadPool(10); threadPoolService.execute(new Runnable() { @Override public void run() { Thread thread = Thread.currentThread(); String name = thread.getName(); System.out.println(name); } });
newScheduledThreadPool
/** * 可支持定時任務的線程池 * 下面的例子表示任務再3分鐘後執行 */ ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(100); scheduledThreadPool.schedule(new Runnable() { @Override public void run() { System.out.println("test"); } },3L,TimeUnit.MINUTES);
newSingleThreadExecutor
/** * 創建單線程化的線程池,他只會用唯一的工作線程來執行任務,保證所有的任務按照順序來執行。 */ ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) { final int index=i; singleThreadExecutor.execute(new Runnable() { @Override public void run() { try { System.out.println("testing..... index: "+index); Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); } } }); }
newCachedThreadPool
/** * 可緩存的線程池 * 查看源碼發現是,再我們使用完後,線程不會立刻銷燬,先緩存起來過了活躍時間後才銷燬 */ ExecutorService cachedThreadPool = Executors.newCachedThreadPool(); cachedThreadPool.execute(new Runnable() { @Override public void run() { System.out.println("test..."); } });
ThreadPoolExecutor :
在Java開發規範中,寫到這些線程的默認值過大,一般採用的是底層的線程池[ ThreadPoolExecutor ],來自己創建線程池,如下:
ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 100, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); executor.execute(new Runnable() { @Override public void run() { System.out.println("testing..."); } });