/*
* 一组线程,等待另一组线程。
*
*/
public class CountDownLatchDemo {
public static void main(String[] args) throws InterruptedException {
final CountDownLatch cdl = new CountDownLatch(1);
final CountDownLatch cdl2 = new CountDownLatch(3);
// 裁判
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("预备:");
//此处倒计时3秒
for (int i = 3; i >= 1; i--) {
System.out.println(i + "...");
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("跑!");
// 计数器 减1,此时在cdl上等待的运动员线程等待状态被解除,开始执行
cdl.countDown();
}
}).start();
// 运动员
for (int i = 0; i < 3; i++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
cdl.await(); // 等待,直到计数器变为0(也就是倒数结束)为止
System.out.println(Thread.currentThread().getName() + ":启动了...");
TimeUnit.SECONDS.sleep(new Random().nextInt(5)+1);
System.out.println("--》"+Thread.currentThread().getName() + ":到达终点了...");
//计数器减1,三个运动员线程启动完毕之后,在cdl2上等待的宣布成绩线程解除等待状态
cdl2.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
new Thread(new Runnable() {
@Override
public void run() {
try {
cdl2.await();
System.out.println("宣布成绩!");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
结果:
预备:
3...
2...
1...
跑!
Thread-2:启动了...
Thread-1:启动了...
Thread-3:启动了...
--》Thread-2:到达终点了...
--》Thread-3:到达终点了...
--》Thread-1:到达终点了...
宣布成绩!