ThreadPoolExecutor 参数解析
corePoolSize 核心线程数
- 即使没有任务执行,核心线程也会一直存活
- 线程数小于核心线程时,即使有空闲线程,线程沲也会创建新线程执行任务
- 设置allowCoreThreadTimeout=true时,核心线程会超时关闭
maximumPoolSize 最大线程数
- 当所有核心线程都在执行任务,且任务队列已满时,线程沲会创建新线程执行任务
- 当线程数=maxPoolSize,且任务队列已满,此时添加任务时会触发RejectedExecutionHandler进行处理
keepAliveTime 线程空闲时间
- 如果线程数>corePoolSize,且有线程空闲时间达到keepAliveTime时,线程会销毁,直到线程数量=corePoolSize
- 如果设置allowCoreThreadTimeout=true时,核心线程执行完任务也会销毁直到数量=0
TimeUnit 时间单位
- TimeUnit.DAYS; //天
- TimeUnit.HOURS; //小时
- TimeUnit.MINUTES; //分钟
- TimeUnit.SECONDS; //秒
- TimeUnit.MILLISECONDS; //毫秒
- TimeUnit.MICROSECONDS; //微妙
- TimeUnit.NANOSECONDS; //纳秒
workQueue 任务队列
- ArrayBlockingQueue 有界队列,需要指定队列大小
- LinkedBlockingQueue 若指定大小则和ArrayBlockingQueue类似,若不指定大小则默认能存储Integer.MAX_VALUE个任务,相当于无界队列,此时maximumPoolSize值其实是无意义的
- SynchronousQueue 同步阻塞队列,当有任务添加进来后,必须有线程从队列中取出,当前线程才会被释放,newCachedThreadPool就使用这种队列
ThreadFactory 创建线程的工厂
- 通过他可以创建线程时做一些想做的事,比如自定义线程名称
RejectedExecutionHandler 线程数和队列都满的情况下,对新添加的任务的处理方式
- AbortPolicy 直接抛出异常
- CallerRunsPolicy 直接调用新添加runnable.run函数执行任务
- DiscardPolicy 直接抛弃任务,什么也不干
- DiscardOldestPolicy 抛弃队列中最先加入的任务,然后再添加新任务
ThreadPoolExecutor五种状态
运行状态 | 状态描述 |
---|---|
RUNNING | 能接受新提交的任务,并且也能处理阻塞队列中的任务 |
SHUTDOWN | 关闭状态,不再接收新提交的任务,但却可以继续处理阻塞队列中已保存的任务 |
STOP | 不能接收新任务,也不处理队列中的任务,会中断正在处理任务的线程 |
TIDYING | 所有的任务都已终止了,workerCount(有效线程数)为0 |
TERMINATED | 在terminated()方法执行完后进入该状态 |
线程池生命周期状态转换
标题:ThreadPoolExecutor解析
作者:JonLv
地址:http://39.108.183.139:8080/articles/2023/03/11/1678547761263.html