AsyncConfigurer与JDK包中线程池
1. Async异步方法线程池配置
|
|
2. ThreadPoolTaskExecutor类
参数:
- poolSizeMonitor:用于加锁
- corePoolSize
- maxPoolSize
- keepAliveSeconds
- queueCapacity
- allowCoreThreadTimeOut
- threadPoolExecutor:真正的线程池
参数的get/set方法都加了synchronized关键字,锁住了poolSizeMonitor对象
- 队列:传入参数大于0,则为LinkedBlockingQueue,否则使用SynchronousQueue,都强制类型转换成BlockingQueue
- 继承了ExecutorConfigurationSupport类
3. java.util包中的threadPoolExecutor类
线程Size:
- 线程数小于corePoolSize,直接新建线程
- 大于corePoolSize,小于maximumPoolSize,队列满时才新建线程
- prestartCoreThread方法:预先创建线程
ThreadPoolFactory创建线程:可修改线程组名称,优先级等
- Keep-alive:线程数大于corePoolSize,等候超过一定时间后中断线程
队列Queue:
- SynchronousQueue:无缓冲队列,生产者直到消费者就位才执行,可以避免任务线程互相等待的情况。一般要求maximumPoolSize设置越大越好
- LinkedBlockingQueue:无界队列,不会有超过corePoolSize数量的线程。适用于线程完全独立的情况,处理瞬态突发请求,Web服务器中常用
- ArrayBlockingQueue:有界队列,可以控制系统资源消耗,但是需要在队列长度和线程数之间做平衡
拒绝策略Policy:
- AbortPolicy:抛RejectedExecutionException异常
- CallerRunsPolicy:提供简单的反馈控制机制,能够减缓新任务的提交速度
- DiscardPolicy:直接drop任务
- DiscardOldestPolicy:删除队列头部的任务,重试
Hook方法:
- beforeExecute:初始化ThreadLocal,添加Log信息等
- afterExecute:统计数据,收尾处理等
ctl:为了包装workerCount和runState为一个int,限制任务线程数量为(2^29)-1,大约500百万个线程。后两位保存线程状态
线程池状态:
- RUNNING:接受新的任务,处理队列任务;
- SHUTDOWN:不在接受新的任务,处理队列任务;
- STOP:不在接受新任务,不处理队列任务,中断正在执行的任务线程;
- TIDYING:所有的任务已经结束,任务线程为0,线程转换到TIDYING;
- TERMINATED:线程池已将结束,即terminated()方法执行完。
参数:所有用于控制参数被修饰为volatile,以便正在进行的操作都是基于最新值。