Skip to content

Java 多线程

线程池的核心参数有哪些? 分别是什么含义?

参数含义约束
corePoolSize核心线程数<=maximumPoolSize
maximumPoolSize最大线程数>=corePoolSize
keepAliveTime空闲线程存活时间
unit时间单位
workQueue任务队列NotNull
threadFactory线程工厂NotNull
handler拒绝策略NotNull

线程池的工作原理是什么?

java
线程池提交(commit)任务时:
初始状态: 当前线程数 < 核心线程数, 创建新线程运行该任务

入队状态: 当前线程数 >= 核心线程数并且 < 最大线程数, 根据任务队列判断:
	如果队列已满, 创建临时线程运行该任务;
	如果队列没满, 将任务添加到队列;

拒绝状态: 当前线程数 >= 最大线程数, 根据任务队列判断:
	如果队列已满, 触发拒绝策略;
	如果队列没满, 将任务添加到队列;

workerCount < corePoolSize, 启动新线程运行该任务
corePoolSize <= workerCount < maximumPoolSize, 队列未满则入队, 队列已满则创建临时线程运行该任务
workerCount >= maximumPoolSize 队列未满则入队, 队列已满则触发拒绝策略

线程池的拒绝策略有哪些?

  • AbortPolicy 拒绝并抛出异常, 默认策略
  • DiscardPolicy 直接丢弃,不抛出异常
  • DiscardOldestPolicy 丢弃入队最久的任务, 尝试重新提交被拒绝的该任务
  • CallerRunsPolicy 丢给调用者运行

基于 MIT 许可发布