线程池
#concurrent/pool
- 线程池:管理线程
- coreSize:通常设置为CPU Core+1,如果是IO密集型则可以设置更大(如CPU Core x2+1)
- 任务队列:缓存任务
- 当线程数小于coreSize,则创建新线程执行新任务
- 当线程数等于coreSize、核心线程繁忙、任务队列未满,则放入任务队列,等待核心线程空闲
- 当线程数大于等于coreSize且小于maxSize、核心线程繁忙、任务队列满,则创建新线程执行,当线程空闲时间超过keepAlive、线程数大于coreSize则销毁
- 当线程数等于maxSize,任务队列满,则执行拒绝策略
- 任务队列类型
- 首先,必须是一个BlockingQueue
- ArrayBlockingQueue:有界
- LinkedBlockingQueue:有/无界,Executors默认无
- PriorityBlockingQueue:优先级无界,使用Comparator排序
- SynchronousQueue:无容量,即无缓存,线程池会直接创建线程执行任务,线程数满则执行拒绝策略
- DelayQueue:无界,Delayed容器,按延时排序,自定义顺序
- allowCoreThreadTimeOut:默认false,允许核心线程在空闲超时时关闭
参考¶
SpringScheduling¶
- springboot-2.5.15
- coreSize:1
- maxSize:Integer.MAX_VALUE
- keepAlive:0
- 拒绝策略:AbortPolicy
- 可通过TaskSchedulerCustomizer配置
- 可以配置ErrorHandler处理异常,如RejectedExecutionException
- queueCapacity:Integer.MAX_VALUE
- 队列:JUC默认的DelayedWorkQueue,不可配置,除非重写ThreadPoolTaskScheduler
SpringAsync¶
- springboot-2.5.15
- coreSize:8
- maxSize:Integer.MAX_VALUE
- keepAlive:60s
- 拒绝策略:AbortPolicy
- 可通过TaskExecutorCustomizer配置
- queueCapacity:Integer.MAX_VALUE
- 队列:默认无界队列
- 有配置队列容量则用LinkedBlockingQueue
- 无则SynchronousQueue