在一些List处理场景中,为了加速处理,一般使用CountDownLatch+threadPoolExecutor实现并发处理。
但线程池处理中,可能出现未知异常,导致CountDownLatch减1缺少,进一步导致await一直阻塞等待。这种情况,就需要合理设置await的超时等待时间,避免请求一直阻塞等待,影响到其他。
当然,也可以不设置await的超时等待时间,但是需要保证线程执行正常或不正常结束,CountDownLatch一定会减1。
建议两方面都考虑,既处理线程正常或不正常结束的CountDownLatch减1,又设置await合适的时间。
本文提供一个demo,仅供参考。
CountDownLatch.java
1 | // 循环处理节点列表 |
可以看到,await设置了超时时间,以防线程内未知异常,导致countDownLatch一直阻塞。
线程池里的线程,如果结束,使用的是return。在结束之前,一定需要**countDownLatch.countDown()**去减少计数。