concurrent包学习之CountDownLatch
记得在读Java编程思想的时候,Bruce Eckel就有说过,在使用并发的时候,尽量多的使用synchronized关键字,所以当时没有太关注concurrent包下的类,而且,当时的工作及大环境是很少考虑并发。
如今不一样了,人人都在说大数据,分布式,并发,如果作为一个程序猿,说自己并不了解并发,听上去感觉很丢人的样子,所以,我们就一起来学习一下concurrent包下的神奇的功能吧。
今天我们要掌握的就是CountDownLatch,就像它的名字一样,一个倒计时计数器,当然,因为在concurrent包下,所以它一定是线程安全的。在创建CountDownLatch对象的时候,传入初始值,每当调用一次countDown()方法,计数器就减1,你也可以调用getCount()方法来获取当前计数器的值。只要计数器大于0,那么await()方法(当然,await()方法可以传入参数的,超时时间和单位)就会一直阻塞(除非线程被中断或者超出了指定的等待时间),直到计数器等于0的时候,所有阻塞的线程全部被释放。
下面我来看一段代码:
|
|
执行结果:
子线程pool-1-thread-1正在执行
子线程pool-1-thread-3正在执行
子线程pool-1-thread-2正在执行
子线程pool-1-thread-3执行完毕
子线程pool-1-thread-2执行完毕
当前计数器的值:1
子线程pool-1-thread-1执行完毕
当前计数器的值:2
当前计数器的值:0
等待3个子线程执行完毕...main
3个子线程已经执行完毕main
继续执行主线程main
通过结果我们可以看到,主线程main是在等待所有子线程执行完毕才执行的,当然sun官方给的例子就很好,CountDownLatch在某些时候很适合用来做为开关使用。
下一篇我们就来学习一下和CountDownLatch很像的CyclicBarrier吧。