引言:
Executors类是一个用于创建线程池的工具类,用于创建几种常用的线程池及线程工厂Executor、ExecutorService、ThreadFactory、Callable等。
线程池的核心参数:
corePoolSize:线程池中的核心线程数,一般是线程池中保留的线程数,即使空闲也不会被清理,除非设置了allowCoreThreadTimeout为true。
maximumPoolSize:线程池中允许存放最大的线程数量。
keepAliveTime:非corePoolSize范围内的线程,该线程空闲的时间超过keepAliveTime时间,该线程将被终止。
workQueue:线程池中任务存放的容器队列,阻塞队列,常用的有以下几种:
ArrayBlockingQueue:数组方式有界队列,如果队列已满,则入队失败。
LinkedBlockingQueue:链表模式无界队列,如果运行的线程大于corePoolSize时,新到来的任务会入队等待,不会直接创建新的线程来执行。
SynchronousQueue:任务直接入线程池而不进入任务队列,如果没有线程则创建一个新的线程来处理该任务。
PriorityBlockingQueue:权重无界队列,根据权重进行出队操作。
queueCapacity:队列容量,注意队列容量不要设置太大或使用默认容器大小。
allowCoreThreadTimeout:是否允许核心线程空闲退出。
任务队列与线程池:
Executors创建的几种常见线程池:
1.固定容量线程池:
newFixedThreadPool
说明:创建一个线程数固定的线程池,该线程池核心线程会一直运行,即使线程因异常退出,也会重新启动。
任务队列使用无界队列LinkedBlockingQueue
代码如下所示:
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue
}
2.单个线程的线程池
newSingleThreadExecutor
说明:线程池只有一个核心线程,核心线程会一直运行
任务队列使用无界队列LinkedBlockingQueue
代码如下所示:
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue
threadFactory));
}
3.缓存队列线程池
newCachedThreadPool
说明:创建一个无核心线程的线程池,需要使用才新建线程,有新的任务立即新建一个线程来处理新任务,未使用的线程空闲时间超过60S会立刻销毁。
队列:SynchronousQueue
代码如下所示:
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue
}
4.定时调用线程池
newScheduledThreadPool
说明:用于执行定时或延迟执行的任务。
以上只是Executors类中的实现,后续详细的线程池实现还请关注后续详解。