1.故障原因
在并发调用时候为了提高并发,使用了线程池去处理,并且使用了CountDownLatch的方式阻塞了主线程,直到所有的请求都返回了结果并成功进行了countDown(),主线程才会被唤醒继续执行。而一旦图2所示中的步骤2出现异常,都将会导致countDown()不会执行,最终CountDownLatch不会减到0,相应的任务线程就不会被唤醒。当异常越来越多时,最终就是线程池核心线程数、队列、最大线程数都上升到最大值,线程池抛弃策略又是CallerRunsPolicy()由主线程执行,最终导致web请求线程耗完,从而请求无法进入系统。
解决方案
在发生异常时,对异常进行捕获后执行countDown(),确保CountDownLatch数量会减到0,唤醒主线程继续执行后续逻辑。
总结:使用线程池时候,需要解决异常