原生的线程池
private static ExecutorService executor = new ThreadPoolExecutor(
5,
10,
0,
TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(5),
new ThreadPoolExecutor.AbortPolicy()
);
其中参数的含义如下,
- corePoolSize 线程池维护线程的最少数量
- maximumPoolSize 线城市维护线程的最大数量
- keepAliverTime 线程池维护线程所允许的空闲时间
- unit 线程池维护线程所允许的空闲时间的单位
- workQueue 线程池所使用的缓冲队列
- handler 线程池对拒绝任务的处理策略
那么线程池是如何工作的呢?
- 如果当前线程池中的线程数小于corePoolSize,则即使当前线程池中的线程处于空闲状态,也会创建一个新的线程来处理。
- 如果当前线程池中的线程数等于corePoolSize,但是缓冲队列workQueue未满,则新的任务会被加入到缓冲队列
- 如果当前线程池中的线程数等于或大于corePoolSize,且此时缓冲队列workQueue已满,线程总数小于maximumPoolSize,则会新建线程处理新任务
- 如果当前线程池中的线程数等于或大于corePoolSize,且此时缓冲队列workQueue已满,线程总数等于maximumPoolSize,则会通过handler配置的策略来处理
- 如果当前线程池中的线程数大于corePoolSize,且空闲时间达到keepAliverTime,则线程将被终止
因此,综合来讲,处理任务的优先级为:corePoolSize -> workQueue -> maximumPoolSize
java四种线程池
java有四种线程池:newSingleThreadExecutor(单线程的线程池)、newFixedThreadExecutor(固定数量的线程池)、newCacheThreadExecutor(可缓存线程池)、newScheduleThreadExecutor(大小无限制的线程池),下面针对每一种线程池进行分别讲解:
newSingleThreadExecutor是单线程的线程池,他本身是通过设置corePoolSize=1且maximumPoolSize=1,且实现的是LinkedBlockingQueue这个无界的队列实现。
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
newFixedThreadExecutor是固定数量的线程池,类似于newSingleThreadExecutor,可以理解newSingleThreadExecutor就是一种特殊的newFixedThreadExecutor,实现方式也是一致的。超过nThreads的部分,在LinkedBlockingQueue队列中等待。
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
newCacheThreadExecutor是可缓存的线程池,其实现是通过SynchronousQueue,因此队列中本身不会有等待,新的任务会直接创建新的线程来处理,这样做的风险是极端情况下可能会使服务线程数暴涨,导致内存不够创建线程,导致OOM。
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
newScheduleThreadExecutor是大小无限制的线程池,本身支持定期及周期性执行任务。
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.NANOSECONDS,
new DelayedWorkQueue());
}
workQueue的讨论
queue有三种类型,包括直接提交(SynchronousQueue)、无界队列(LinkedBlockingQueue)、有界队列(ArrayBlockingQueue)。
参考
http://blog.csdn.net/madman188/article/details/51220144
http://blog.csdn.net/yinwenjie/article/details/50522458
http://www.cnblogs.com/guguli/p/5198894.html