1 为什么要使用CountDownLatch
先通过以下例子了解CountDownLatch到作用
1 | package com.mafgwo.juc.testvolatile; |
其他方式实现线程等待如下
1 | package com.mafgwo.juc.testvolatile; |
使用分析
两者的共同点
:都能做到等待全部线程执行完再执行主线程。两者的区别
:CountDownLatch是使用计数方式,await阻塞主线程,当计数为0则继续执行。Thread.join则会不断检查线程是否存在,存活则调用wait方法阻塞线程,等待线程结束时的notifyAll。总结
:CountDownLatch主要是用于多线程时需要完成某些线程,再继续往下执行的场景,不需要等待线程关闭,便于在线程池中使用。注意事项
:第一,CountDownLatch.countDown()方法要放在finally中,避免程序异常未执行减1操作导致不必要的阻塞;第二,CountDownLatch.await方法要设置超时时间,避免某些异常场景下出现死锁。