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

2022/7/22 2:00:12

本文主要是介绍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基础----记一次线上的CountDownLatch引发的死锁问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程