CountDownLatch闭锁作为JUC中带计数功能的锁之一(另外两个常用的为CyclicBarrier和Semaphore),其主要使用方法和功能为:在当前线程A中启动多个子线程a,b,c。在不使用CountDownLath时,主线程不会等待子线程a,b,c执行结束再运行自己的逻辑。使用CountDownLatch后,主线程会在所有子线程a,b,c都执行完后,再执行自己的逻辑。
import java.util.concurrent.CountDownLatch;
/**
* @Author Allen
* @Date 2021/3/4 9:43 上午
* @Version 1.0
*/
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(6);
for (int i = 0; i < 6; i++) {
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"=====离开了教室");
//每执行完一个子线程,计数减 1
countDownLatch.countDown();
},CountEnum.getInstance(i).getName()).start();
}
//主线程在当前位置等待,当计数为0时放行
countDownLatch.await();
System.out.println("班长最后锁门后离开了!");
}
}
执行结果:
小0=====离开了教室
小2=====离开了教室
小1=====离开了教室
小3=====离开了教室
小4=====离开了教室
小5=====离开了教室
班长最后锁门后离开了!
package com.yc.uc.test;
import lombok.Getter;
/**
* @Author Allen
* @Date 2021/3/4 9:46 上午
* @Version 1.0
*/
public enum CountEnum {
ZERO(0,"小0"),ONE(1,"小1"),TWO(2,"小2"),THREE(3,"小3"),FOUR(4,"小4"),FIVE(5,"小5");
@Getter private int id;
@Getter private String name;
CountEnum(int id, String name) {
this.id = id;
this.name = name;
}
public static CountEnum getInstance(int id){
for (CountEnum s : CountEnum.values()) {
if (id==s.id){
return s;
}
}
return null;
}
}