线程池的注意事项

发布时间 2023-11-23 17:17:36作者: fchhk

父子任务共用同一线程池,系统”饥饿”死锁

当他们都被同一个线程池执行时,一定条件下会出现以下场景:
1、父任务获取到线程池线程执行,而子任务则被暂存到队列中
2、当父任务占满了线程池所有的线程,等待子任务返回结果后,结束父任务
3、此时子任务由于在队列中,一直不能等到线程来处理,导致不能从队列中释放
4、父子任务互相等待,从而造成”饥饿”死锁

我们举一个简单例子:

假设线程池参数设置为:核心和最大线程数为1,队列容量为1

A方法内调用B方法:
A() {
   B();
}

1、线程池创建核心线程,并执行A方法
2、执行到B方法时,将B交给线程池执行,由于没有多余线程,因此暂存队列
3、A任务等待B任务执行完,B任务等待A任务释放线程。从而互相等待,造成”饥饿”死锁

解决方案:

问题原因在于互相等待,因此只要保证类似的 父子任务不要被同一线程池执行即可