要點
CountDownLatch:一種同步輔助工具,允許一個或多個線程等待,直到在其他線程中執(zhí)行的一組操作完成;
理解
示例
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));
/**
* 減少閂鎖的數(shù)量
*/
countDownLatch.countDown();
System.out.println(format("[%s]熱身完成,已就位", name));
/**
* 線程等待树瞭,直到閂鎖的數(shù)量為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("所有運用員都已經(jīng)準備好");
} catch (Exception e) {
e.printStackTrace();
}
}
}
執(zhí)行結果
[2號運動員]熱身[1]秒
[2號運動員]熱身完成,已就位
[1號運動員]熱身[2]秒
[3號運動員]熱身[2]秒
[1號運動員]熱身完成爱谁,已就位
[3號運動員]熱身完成晒喷,已就位
所有運用員都已經(jīng)準備好
[1550024832810][1號運動員]開跑......
[1550024832810][3號運動員]開跑......
[1550024832810][2號運動員]開跑......