同一线程池使用嵌套线程互相等待未释放问题

1. 现象描述

开发过程中本地调试一个程序,这个程序是:A线程调用B线程 (A、B线程都是异步调用,使用的是同一个线程池),在A线程中需要阻塞,等待B线程执行完毕拿到返回值。
这个程序本地调试没有任何问题,放到线上就程序卡死
在这里插入图片描述

2. 问题分析

经过反复测试,只有当A线程同一时间调用数量过多时,才会出现这种情况,因此,我们看下线程池配置
在这里插入图片描述
可以看到核心线程数是16 并且队列大小是无限大(Integer最大值)

当同时请求数是16个或超过16个时,A把核心线程全部占用,同时A需要创建一个新线程B,但是由于现在核心线程数已经全部占用,那么jvm把开启新线程B这个任务放到线程池的队列中(A B是同一个线程池),等到A结束释放线程才能够开启新线程的任务,但是A线程的结束时需要创建出B线程,
因此造成AB相互等待的情况

3. 解决方案

  1. A B分别使用不同的线程池
  2. 考虑提高核心线程数 或 降低队列大小到合适数值
  3. 使用CountDownLatch等JUC工具包限制同时并发数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值