ThreadPoolExecutor 的线程池中的七个参数解释。(四个构造方法)
1、corePoolSize
-核心线程数
在线程池空闲时,池中运行的线程数;在线程池队列没有满时,池中运行的线程数;
2、maxPoolSize
-最大线程数
在线程池中的线程数量等于核心线程且工作队列已满时,线程池会创建新的线程直到该最大的线程数。当再有线程进来的时候,将拒绝新进线程抛出异常(看rejectHandler如何设置)
3、keepAliveTime
-线程(核心线程外的线程)存活时间
核心线程以外的线程在线程池中存活时间。(如果allowCoreThreadTimeout设置为true,则所有线程均会在存活时间后退出直到为零,一般设置为false)
4、unit
-存活时间的单位
空闲线程存活时间单位
5、workQueqe
– 工作队列
总有四种队列:ArrayBlockingQueue
,LinkedBlockingQuene
,SynchronousQuene
,PriorityBlockingQueue
;
ArrayBlockingQueue
:有界队列,可以设置队列大小。如果队列满了,将触发线程池中的RejectedHandler
策略;-
LinkedBlockingQuene
: 无界队列,可以向该队列无限添加任务,直到内存溢出; -
SynchronousQuene
:阻塞队列。可以简单理解成容量只有1的队列,每个put都必须等到一个take。Executers.newCachedThreadPool
使用的这个队列; -
PriorityBlockingQueue
:优先级队列。线程池会优先选取优先级高的任务执行,队列中的元素需要继承comparable
接口。
6、threadFactory – 线程工厂
用来设置线程名、是否为 daemon 线程。
CustomizableThreadFactory
:ThreadFactory threadFactory = new CustomizableThreadFactory(“thread-factory-pool-“);-
ThreadFactoryBuilder
:ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat(“thread-factory-pool-“).build(); -
BasicThreadFactory
: ThreadFactory threadFactory = new BasicThreadFactory.Builder.namingPattern(“thread-factory-pool-“).build();
上述实质等于 Thread thread = new Thread(); thread.setName("thread-factory-pool-");
7、rejectHandler – 拒绝策略
总共有四种拒绝策略:CallerRunsPolicy
, AbortPolicy
, DiscardPolicy
, DiscardOldestPolicy
CallerRunsPolicy
:如果添加失败,将由主线程代理执行executor方法;-
AbortPolicy
:如果添加失败,将抛出异常RejectedExecutionException
;(线程池默认策略) -
DiscardPolicy
:如果添加失败,直接丢弃掉,不抛弃异常; -
DiscardOldestPolicy
:如果添加失败,将队列中最早添加的元素移除,再次添加,如果添加失败继续上述操作;
JDK四个预定义线程池(jdk1.5之后)
1、newFixedThreadPool
-固定数量的线程池
它是一种固定大小的线程池。corePoolSize
和maximunPoolSize
都为用户设定的线程数量nThreads
,keepAliveTime
为0,意味着一旦有多余的空闲线程,就会被立即停止掉;但这里keepAliveTime
无效。阻塞队列采用了LinkedBlockingQueue
,它是一个无界队列;由于阻塞队列是一个无界队列,因此永远不可能拒绝任务。由于采用了无界队列,实际线程数量将永远维持在nThreads
,因此maximumPoolSize
和keepAliveTime
将无效。
public static ExecutorService newFixedThreadPool(int nThreads){
return new ThreadPoolExecutor(nThreads,nThreads,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}
2、newCachedThreadPool
-缓存线程池
它比较适合处理执行时间比较小的任务;corePoolSize
为0
,maximumPoolSize
为无限大,意味着线程数量可以无限大;keepAliveTime
为60S,意味着线程空闲时间超过60S就会被杀死;采用SynchronousQueue
装等待的任务,这个阻塞队列没有存储空间,这意味着只要有请求到来,就必须要找到一条工作线程处理他,如果当前没有空闲的线程,那么就会再创建一条新的线程。
public static ExecutorService newCachedThreadPool(){
return new ThreadPoolExecutor(0,Integer.MAX_VALUE,60L,TimeUnit.MILLISECONDS,new SynchronousQueue<Runnable>());
}
3、scheduledThreadPool
public ScheduledThreadPoolExecutor(int corePoolSize) {
super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
new DelayedWorkQueue());
}
定时功能实现:scheduleAtFixedRate(command, initialDelay, period, unit)
command
: 执行的线程(可自己New一个)-
initialDelay
:初始化执行的延时时间 -
period
: 时间间隔 -
unit
: 时间类型
stThread.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.println(new Date());
}
}, 20, 2, TimeUnit.SECONDS);
延时功能实现:
-
callable
:回调方法 -
delay
:延时时间 -
unit
:时间类型 , 同定时器的unit一样
stThread.schedule((RolePrvlegeTask)SpringUtils.getBean("rolePrvlegeTask"), 1, TimeUnit.SECONDS);
4、SingleThreadExecutor
public static ExecutorService newSingleThreadExecutor(){
return new ThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,new LinkedBlockingQueue<Runnable>());
}