CountDownLatch 介绍
用来进行线程同步协作,等待线程完成倒计时。
其中构造参数用来初始化等待计数值,await() 用来等待计数归零,countDown() 用来让计数减一
实验概述
- 定义10个线程执行任务,任务执行完倒计时-1。
- 每个线程的任务更改 String all[10] 数组 对应下标的内容
- 每个任务循环101次,将数组对应下标的内容从 0% 逐渐改到 100%
- 每次改完输出整个数组内容,一共输出 1010 次
实现
代码
public static void main(String[] args) {
AtomicInteger num = new AtomicInteger(0);
//创建固定数量为10的线程池,指定拒绝策略
ExecutorService service = Executors.newFixedThreadPool(10, (r) -> {
return new Thread(r, "t" + num.getAndIncrement());
});
//创建倒计时锁
CountDownLatch latch = new CountDownLatch(10);
String[] all = new String[10];
Random r = new Random();
//创建10个线程参与倒计时
for (int j = 0; j < 10; j++) {
int x = j;
service.submit(() -> {
for (int i = 0; i <= 100; i++) {
try {
//随机休眠,模拟网络延迟
Thread.sleep(r.nextInt(100));
} catch (InterruptedException e) {
}
all[x] = Thread.currentThread().getName() + "(" + (i + "%") + ")";
//\r可以让当前输出覆盖上一次的输出。
System.out.print("\r" + Arrays.toString(all));
}
latch.countDown();
});
}
//主线程开启倒计时,阻塞...
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("\n游戏开始...");
service.shutdown();
}
输出
部分输出,不换行输出可以模拟游戏加载
[t0(95%), t1(100%), t2(100%), t3(100%), t4(100%), t5(100%), t6(100%), t7(100%), t8(100%), t9(100%)]
[t0(96%), t1(100%), t2(100%), t3(100%), t4(100%), t5(100%), t6(100%), t7(100%), t8(100%), t9(100%)]
[t0(97%), t1(100%), t2(100%), t3(100%), t4(100%), t5(100%), t6(100%), t7(100%), t8(100%), t9(100%)]
[t0(98%), t1(100%), t2(100%), t3(100%), t4(100%), t5(100%), t6(100%), t7(100%), t8(100%), t9(100%)]
[t0(99%), t1(100%), t2(100%), t3(100%), t4(100%), t5(100%), t6(100%), t7(100%), t8(100%), t9(100%)]
[t0(100%), t1(100%), t2(100%), t3(100%), t4(100%), t5(100%), t6(100%), t7(100%), t8(100%), t9(100%)]