倒时计数器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()+" 班长锁门走人了");
}
}
运行结果如图:线程执行混乱,学生还没全离开班长就锁门了
代码②(使用倒时计数器)
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()+" 班长锁门走人了");
}
}
运行结果如图:无论执行多少次,只有所有同学都离开教室,最后的班长锁门线程才会执行