线程池的注意事项
父子任务共用同一线程池,系统”饥饿”死锁
当他们都被同一个线程池执行时,一定条件下会出现以下场景:
1、父任务获取到线程池线程执行,而子任务则被暂存到队列中
2、当父任务占满了线程池所有的线程,等待子任务返回结果后,结束父任务
3、此时子任务由于在队列中,一直不能等到线程来处理,导致不能从队列中释放
4、父子任务互相等待,从而造成”饥饿”死锁
我们举一个简单例子:
假设线程池参数设置为:核心和最大线程数为1,队列容量为1
A方法内调用B方法:
A() {
B();
}
1、线程池创建核心线程,并执行A方法
2、执行到B方法时,将B交给线程池执行,由于没有多余线程,因此暂存队列
3、A任务等待B任务执行完,B任务等待A任务释放线程。从而互相等待,造成”饥饿”死锁
解决方案:
问题原因在于互相等待,因此只要保证类似的 父子任务不要被同一线程池执行即可
偶做前堂客
祝你天天开心
在未知的时间
在未知的地点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了