编程语言
首页 > 编程语言> > java基础----记一次线上的CountDownLatch引发的死锁问题

java基础----记一次线上的CountDownLatch引发的死锁问题

作者:互联网

1. 大概流程:主线程A执行获取后台广告相关的所有数据,在主线程方法中,开启了一个数量是5(需要获取5部分数据)的CountDownLatch,运行5个子线程A1、A2、A3、A4、A5。这5个子线程用的是threadPool1,目的是获取数据后在主线程中合并。在A2线程中,因为这个线程需要处理的数据量比较大,所以也在里面开启了一个数量是N的CountDownlatch,N取决于大数据量需要几次能获取完。然后这个里面的N个线程用的线程池也是threadPool1。假设这里是200个批次,那就是需要开启200个线程,标记为B0,B2.....B200。线程池设置的核心线程数量是30,最大到60,队列大小是100。

引发问题:主线程中如果有新的请求进来需要把任务加到等待队列中。A2也需要把来不及执行的任务放到队列中,主线程需要等待A2执行完继续往下走,A2在等待主线程执行完释放线程,形成死锁。

解决方式:主线程和开启的多个线程,和子线程开启的多个线程用不同的线程池去管理,避免相互等待。同时在主线程的await方法中添加等待的过期时间,避免一直阻塞。

 

标签:需要,java,主线,开启,----,死锁,A2,线程,等待
来源: https://www.cnblogs.com/ygliu/p/15676584.html