并发之线程池
- 日常所说的“核心线程”、“非核心线程”是一个虚拟的概念,是为了方便描述而虚拟出来的概念
- 在代码中并没有标记哪些线程为“核心线程”或者“非核心线程”。所有线程都是一样的。
为什么使用线程池
- 减少线程的创建与销毁
- 减少cpu的资源切换。如果线程很多的情况下,cpu切换会很大消耗资源。线程池的存在可以有效的限定执行的线程数量。
- 线程池可以监控线程的执行状态,便于分析处理
线程池是如何实现的?
在Java中,线程池中所谓的“线程”,其实就是一个静态内部类Worker
,它是基于AQS
实现的,并实现Runnable
。存放在线程池的HashSet<Worker> workers
成员变量中。
而需要执行的任务,则放在BlockingQueue<Runnable> workQueue
中。这样,整个线程实现的基础思想就是:从workerQueue中获取任务,放在worker中进行处理。
静态内部类Worker:
private final class Worker extends AbstractQueuedSynchronizer implements Runnable {......}
线程池的核心参数
corePoolSize
核心线程数量maximunPoolSize
最大线程数量 ,一般 maximunPoolSize > corePoolSizekeepAliveTime
空闲线程的存活时间- 存活时间单位
workQueue
任务队列(共计5种,按照不同的业务场景使用不同的队列)- threadFactory 线程工场对象
- RejectedExecutionHandler 拒绝策列
线程池的线程会在何时创建与销毁
线程池的执行顺序
创建
首先,线程池在创建之初并不会创建线程,当任务来临后才会创建第一个线程,每次创建线程都是做出如下判断:
- 如果正在运行的线程数量 <
corePoolSize
,那么马上创建线程运行这个任务; - 如果正在运行的线程数量 >= corePoolSize,那么将这个任务放入队列;
- 如果这时候队列满了,而且正在运行的线程数量 < maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务;
- 如果队列满了,而且正在运行的线程数量 >= 于maximumPoolSize,那么线程池会抛出异常RejectExecutionException。
销毁
当空闲线程大于空闲存活时间,就会销毁掉。直到线程数量等于核心线程数。剩下的线程就是核心线程。
核心线程是否能销毁
ThreadPoolExecutor
中存在一个参数allowCoreThreadTimeOut
,此参数表示是否允许核心线程超时,默认为 false,所以一般情况下,是不会销毁的。
如果调整参数,是可以做到销毁核心线程的。
核心方法- getWork() 获取任务方法
当线程完成当前任务后,会进入死循环,不断的尝试获取任务。
- 如果 生存时间 >
keepAliveTime
,会返回 null - 如果 生存时间 <
keepAliveTime
,会阻塞获取
线程池的拒绝策略
在添加工作任务时,工作队列满后,会执行拒绝策略(都是静态内部类)
- AbortPolicy:直接抛出拒绝异常,默认项
- CallerRunsPolicy:由线程池的调用者线程去执行多余的方法,串行执行。场景:所有任务都要执行。
- DiscardOledestPolicy:放弃等待队列中最老的数据,迎接新的数据
- DiscardPolicy:直接无视,不做任何处理。不添加队列,不报错,不做标识
逻辑:查看 ThreadPoolExcutor.java
文件中 public void execute(Runnable var1) {......}
方法
任务线程如何被回收(存活时间到了)?回收前需要做哪些判断?
- 如果线程是异常结束的,则将 workerCount 数量 -1
- 将任务线程的taskCount,加到 线程池的 taskCount 上
- 将 任务线程 从 HashSet中删除。此时,从线程池上看线程已删除
- tryTerminate方法的作用,线程凉了,需要查一下,是不是线程也凉了
- 如果因为任务线程结束,导致线程池没有线程。但还有任务,则需要创建一个非核心线程
最后,任务线程给被 GC 回收掉
回收的方式,就是run方法结束了,线程就销毁了。
小结
线程池的大流程
可以忽略的学习笔记
__EOF__

本文作者:之士咖啡
本文链接:https://www.cnblogs.com/zz-1q/p/17785416.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/zz-1q/p/17785416.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~