Java高并发--倒时计数器(CountDownLatch)

220 阅读1分钟

倒时计数器CountDownLatch

CountDownLatch是一个很实用的多线程控制工具类。这个类通常用来控制线程等待,它可以让某一个线程等待直到倒计数结束,再开始执行。 其中两个主要的方法:

  • await():使得当前线程在锁存器倒计数至零之前一直等待,除非线程被中断
  • countDown():递减锁存器的计数,如果计数达到零,将释放所有等待的线程 案例:要求所有学生离开教室之后,班长才能锁门

代码①(不使用倒时计数器)

public class CountDownLatchDemo1 {
    //6个同学陆续离开教室之后,班长锁门
    public static void main(String[] args) throws InterruptedException {
        //6个同学陆续离开教室之后
        for (int i = 1; i <=6; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+" 号同学离开了教室");
            },String.valueOf(i)).start();
        }
        System.out.println(Thread.currentThread().getName()+" 班长锁门走人了");
    }
}

运行结果如图:线程执行混乱,学生还没全离开班长就锁门了

image.png

代码②(使用倒时计数器)

import java.util.concurrent.CountDownLatch;

/**
 * @author GuoZeWei
 * @date 2022/5/1  21:10
 */
public class CountDownLatchDemo2 {
    //6个同学陆续离开教室之后,班长锁门
    public static void main(String[] args) throws InterruptedException {
        //创建CountDownLatch对象,设置初始值
        CountDownLatch countDownLatch = new CountDownLatch(6);
        //6个同学陆续离开教室之后
        for (int i = 1; i <=6; i++) {
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+" 号同学离开了教室");
                //计数  -1
                countDownLatch.countDown();
            },String.valueOf(i)).start();
        }
        //等待
        countDownLatch.await();
        System.out.println(Thread.currentThread().getName()+" 班长锁门走人了");
    }
}

运行结果如图:无论执行多少次,只有所有同学都离开教室,最后的班长锁门线程才会执行

image.png