juc并发控制--CountDownLatch使用


juc(
java.util.concurrent
)包是
Doug Lea
大神为了解决jdk内置的高并发机制性能问题,设计的一套高并发
,大神希望它
能够成为高并发需求的基础。今天我们讲解它的4大并发工具之一:
CountDownLatch。

CountDownLatch类
CountDownLatch 是juc包下的一个同步工具类,功能同java内置
Thread 的join很相似
,同时功能和性能又高于join,处理细节的能力比join更为精确。
CountDownLatch本质是一个高并发计数器,初始化是需要给它设置计数器初始值。
CountDownLatch的3个常用方法:
public
 
CountDownLatch(
int
 
count)
构造方法,设置计数器出事值。
public
 void
await
();

函数用于阻塞当前线程直到CountDownLatch的计数值变为0时,当前线程才能重新唤起运行。
public
 void
countDown
();
方法用于将当前CountDownLatch的计数值减1

使用
假设现在公司有三个员工A,B,C,他们要开会。但是A需要等B,C准备好之后再才能开始,B,C需要同时准备。代码:
Employee.java:
public class Employee extends Thread{ private String employeeName; private long time; private CountDownLatch countDownLatch; public Employee(String employeeName,long time, CountDownLatch countDownLatch){ this.employeeName = employeeName; this.time = time; this.countDownLatch = countDownLatch; } @Override public void run() { try { System.out.println(employeeName+ “开始准备”); Thread.sleep(time); System.out.println(employeeName+” 准备完成”); countDownLatch.countDown(); } catch (Exception e) { e.printStackTrace(); } }}

CountDownLatchTest.java:
public class CountDownLatchTest { public static void main(String[] args) throws InterruptedException { CountDownLatch countDownLatch = new CountDownLatch(2); Employee a = new Employee(“A”, 3000,countDownLatch); Employee b = new Employee(“B”, 3000,countDownLatch); Employee c = new Employee(“C”, 4000,countDownLatch); b.start(); c.start(); countDownLatch.await(); System.out.println(“B,C准备完成”); a.start(); }}
输出结果如下:
B开始准备C开始准备B 准备完成C 准备完成B,C准备完成A开始准备A 准备完成

上述就是CountDownLatch类的常规用法,大家可能会注意到,其实上述过程用Thread的join方法也能实现。确实CountDownLatch解决的场景大部分都能用join解决。但是需要注意一个区别: join是需要线程run方法全部执行完才能执行另一个等待线程,而CountDownLatch就不需要,在线程执行过程中,只要countDown让计数器到0,那么await线程就能继续执行,不需要countDown线程的run执行完成。

    原文作者:JUC
    原文地址: https://blog.csdn.net/meiliangdeng1990/article/details/80855013
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞