Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说Java中的并发工具类CountDownLatch,希望能够帮助你!!!。
在多线程编程的时候,有时候需要控制并发流,Java本身提供了几个控制并发的工具类,比如CountDownLatch,CyclicBarrier,Semaphore等。
1、CountDownLatch允许一个或者多个线程等等其他线程完成。如果有个会议,等所有的人到了才能开始,假如每个人都是一个线程,开会需要等待每个线程结束。
CountDownLatch.countDown()这个方法是CountDownLatch会把计数器的值减1,CountDownLatch.await()等待计数器为0时才会执行下面的代码。
输出结果如下,等所有的线程结束,才会往下执行。
大家好,报道3
大家好,报道2
大家好,报道1
大家好,报道5
大家好,报道4
大家好,报道9
大家好,报道10
大家好,报道8
大家好,报道7
大家好,报道6
大家好,报道13
大家好,报道12
大家好,报道11
大家好,报道17
大家好,报道16
大家好,报道15
大家好,报道20
大家好,报道14
大家好,报道19
大家好,报道18
人已到齐,开始开会!
2、CyclicBarrier同步屏障。可以循环使用的屏障,让一组线程到达一个屏障时被阻塞,等到最后一个线程到达屏障时才会开门。用这个CyclicBarrier实现上面的需求,有几处地方需要修改,最主要的是CountDownLatch换成了CyclicBarrier,CyclicBarrier的构造方法里的参数表示要拦截的数量,这里是21包括主线程。再就是把原来的线程池换成了不限制数量的,如果最大是10个线程,这个程序永远不会执行完毕。输出的结果和上次一样。
3、Semaphore信号量。Semaphore用来控制同时访问资源的线程数量,比如用来限制流量,限制并发数等。acquire()方法是获取一个通行证,releas()方法是归还通行证。比如进小区的安检,只能一个一个的来,代码实现如下。
这几个都是面试中可能问到的,先了解下。
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。