要点
CountDownLatch:一种同步辅助工具,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成;
理解
示例
package com.zoterap.javabasic.current;
import lombok.AllArgsConstructor;
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import static java.lang.String.format;
public class CountDownLatchDemo {
private static final int num = 3;
private static CountDownLatch countDownLatch = new CountDownLatch(num + 1);
private static Random random = new Random();
/**
* 运动员线程
*/
@AllArgsConstructor
static class SportsManThread extends Thread {
private String name;
@Override
public void run() {
int warmUpTime = random.nextInt(3) + 1;
try {
TimeUnit.SECONDS.sleep(warmUpTime);
System.out.println(format("[%s]热身[%d]秒", name, warmUpTime));
/**
* 减少闩锁的数量
*/
countDownLatch.countDown();
System.out.println(format("[%s]热身完成,已就位", name));
/**
* 线程等待,直到闩锁的数量为0
*/
countDownLatch.await();
System.out.println(format("[%d][%s]开跑......", System.currentTimeMillis(), name));
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
for (int i = 1; i < num + 1; i++) {
new SportsManThread(i + "号运动员").start();
}
try {
countDownLatch.countDown();
countDownLatch.await();
System.out.println("所有运用员都已经准备好");
} catch (Exception e) {
e.printStackTrace();
}
}
}
执行结果
[2号运动员]热身[1]秒
[2号运动员]热身完成,已就位
[1号运动员]热身[2]秒
[3号运动员]热身[2]秒
[1号运动员]热身完成,已就位
[3号运动员]热身完成,已就位
所有运用员都已经准备好
[1550024832810][1号运动员]开跑......
[1550024832810][3号运动员]开跑......
[1550024832810][2号运动员]开跑......