父子任务共用同一线程池,系统”饥饿”死锁
当他们都被同一个线程池执行时,一定条件下会出现以下场景:
1、父任务获取到线程池线程执行,而子任务则被暂存到队列中
2、当父任务占满了线程池所有的线程,等待子任务返回结果后,结束父任务
3、此时子任务由于在队列中,一直不能等到线程来处理,导致不能从队列中释放
4、父子任务互相等待,从而造成”饥饿”死锁
我们举一个简单例子:
假设线程池参数设置为:核心和最大线程数为1,队列容量为1
A方法内调用B方法:
A() {
B();
}
1、线程池创建核心线程,并执行A方法
2、执行到B方法时,将B交给线程池执行,由于没有多余线程,因此暂存队列
3、A任务等待B任务执行完,B任务等待A任务释放线程。从而互相等待,造成”饥饿”死锁
解决方案:
问题原因在于互相等待,因此只要保证类似的 父子任务不要被同一线程池执行即可