jdk中Executors类提供了5种已经定义好的线程池,分别为以ThreadPoolExecutor为基础的基本线程池FixedThreadPool,SingleThreadExecutor,CachedThreadPool。以ScheduledThreadPoolExecutor为基础的定时线程池SingleThreadScheduledExecutor,ScheduledThreadPool。要搞懂这几个线程池只需要搞懂ThreadPoolExecutor和ScheduledThreadPoolExecutor就可以了。
至于为何这样说根据构造方法就可以发现:
package ThreadPoolExecutor.jdkDefined;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
public class AllJdkExecutorServiceDemo {
public static void main(String[] args) {
// FinalizableDelegatedExecutorService(可终止授权类)是一个包装类,其继承DelegatedExecutorService类。重写了protected void finalize()方法直接调用shutdown方法来确保线程池在垃圾回收时先执行关闭
// DelegatedExecutorService(授权类)是一个包装类。其仅公开了ExecutorService接口中的方法。并且这些方法的实际调用均是直接调用构造入参的ExecutorService对应的方法
// 也就是说:FinalizableDelegatedExecutorService类只向外暴露ExecutorService接口中的方法,且这些方法的执行都交由入参封装对象的执行
// 这是一种实现非配置型的方案(剔除原始方法之外的附加配置型方法)
/**----------------FixedThreadPool-----------------*/
ExecutorService eService = Executors.newFixedThreadPool(1);// 固定线程量的线程池
/**return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());*/
eService = Executors.newFixedThreadPool(2, Executors.defaultThreadFactory());
/**public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory);*/
// 根据构造可知其实一个核心线程和最大线程数都是入参的ThreadPoolExecutor
/**----------------SingleThreadExecutor-----------------*/
eService = Executors.newSingleThreadExecutor();//
/**
* public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
*/
eService = Executors.newSingleThreadExecutor(Executors.defaultThreadFactory());
/**
* return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory));
*/
// newSingleThreadExecutor是一个只具有ExecutorService中方法,核心线程和最大线程数均为1的ThreadPoolExecutor线程池。
/**----------------CachedThreadPool-----------------*/
eService = Executors.newCachedThreadPool();//
/**
* return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
*/
eService = Executors.newCachedThreadPool(Executors.defaultThreadFactory());
/**
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
*/
// 可以看到这个同样是ThreadPoolExecutor来实现,核心线程为0,最大线程量为Integer.MAX_VALUE,临时线程保存60s,
// 且队列是一个无空间队列,这意味着一但有新任务来就会交给线程执行。
// 如有有空闲的临时线程就用空闲的临时线程,如果没有就创建新的临时线程.临时线程空闲超过60s即被销毁
/**----------------SingleThreadScheduledExecutor-----------------*/
ScheduledExecutorService eService2 = Executors.newSingleThreadScheduledExecutor();//
/**
* return new DelegatedScheduledExecutorService
(new ScheduledThreadPoolExecutor(1));
*/
eService2 = Executors.newSingleThreadScheduledExecutor(Executors.defaultThreadFactory());
/**
* return new DelegatedScheduledExecutorService
* (new ScheduledThreadPoolExecutor(1, threadFactory));
*/
// 一个只具有单线程,且具有定时功能的线程池
/**----------------ScheduledThreadPool-----------------*/
eService2 = Executors.newScheduledThreadPool(1);
/**
* return new ScheduledThreadPoolExecutor(corePoolSize);
*/
eService2 = Executors.newScheduledThreadPool(1, Executors.defaultThreadFactory());
/**
* new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
*/
// 具有定时功能的线程池
/**----------------unconfigurable-----------------*/
eService = Executors.unconfigurableExecutorService(eService);//不可配置线程池
/**
* if (executor == null)
throw new NullPointerException();
return new DelegatedExecutorService(executor);
*/
eService2 = Executors.unconfigurableScheduledExecutorService(eService2);//不可配置定时线程池
/**
* if (executor == null)
throw new NullPointerException();
return new DelegatedScheduledExecutorService(executor);
*/
}
}