一、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
}
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
}
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
}