public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler){ ...... }
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); }
咱們經過查看ScheduledThreadPoolExecutor的源代碼,能夠發現ScheduledThreadPoolExecutor繼承了ThreadPoolExecutor。java
public ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory, RejectedExecutionHandler handler) { super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue(), threadFactory, handler); }
從構造中發現ScheduledThreadPoolExecutor線程池實際上是調用了ThreadPoolExecutor構造進行實現的,只是ThreadPoolExecutor使用的工做隊列是java.util.concurrent.ScheduledThreadPoolExecutor.DelayedWorkQueue經過名字咱們均可以猜到這個是一個延時工做隊列。
由於ScheduledThreadPoolExecutor的最大線程是Integer.MAX_VALUE,並且根據源碼能夠看到execute和submit其實都是調用schedule這個方法,並且延時時間都是指定爲0,因此調用execute和submit的任務都直接被執行。算法
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize); }
ScheduledThreadPoolExecutor 提供了3種延遲執行策略緩存
schedule(commod,delay,unit) ,這個方法是說系統啓動後,須要等待多久執行,delay是等待時間。只執行一次,沒有周期性。服務器
scheduleAtFixedRate(commod,initialDelay,period,unit),固定速率執行週期任務。這個是以period爲固定週期時間,按照必定頻率來重複執行任務,initialDelay是說系統啓動後,須要等待多久纔開始執行。併發
scheduleWithFixedDelay(commod,initialDelay,delay,unit),固定延遲執行週期任務。這個是以delay爲固定延遲時間,按照必定的等待時間來執行任務,initialDelay意義與上面的相同。函數
在Java 7中引入了一種新的線程池:ForkJoinPool。
它同ThreadPoolExecutor同樣,也實現了Executor和ExecutorService接口。它使用了一個無限隊列來保存須要執行的任務,而線程的數量則是經過構造函數傳入,若是沒有向構造函數中傳入但願的線程數量,那麼當前計算機可用的CPU數量會被設置爲線程數量做爲默認值。spa
public static ExecutorService newWorkStealingPool() { return new ForkJoinPool (Runtime.getRuntime().availableProcessors(), ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true); }
併發數默認爲當前系統cpu個數。線程
public static ExecutorService newWorkStealingPool(int parallelism) { return new ForkJoinPool (parallelism, ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true); }
也能夠指定並行數。code