本文最后更新于 831 天前,其中的信息可能已经有所发展或是发生改变。
1. CyclicBarrier
线程同步。cyclicBarrier.reset(); 可以重新执行
所有线程全部完成才可以开始后续操作
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
new Thread(() -> {
try {
Thread.sleep(10_000);
System.out.println("t1 在准备 ");
cyclicBarrier.await(); // 等另外一个一个线程准备好 然后开始做事情
System.out.println("t1 准备好了 ");
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
new Thread(() -> {
try {
Thread.sleep(5_000);
System.out.println("t2 在准备 ");
cyclicBarrier.await(); // 等另外一个一个线程准备好 然后开始做事情
System.out.println("t2 准备好了 ");
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
System.out.println(" 裁判 在准备 ");
cyclicBarrier.await();
System.out.println(" 裁判 准备好了 ");
while (true){
if (cyclicBarrier.getNumberWaiting()==0){
System.out.println(" 时间到: 开始比赛");
return;
}
}
}
2. CountDownLatch
public class CountDownLatchTest {
static CountDownLatch countDownLatch = new CountDownLatch(2);
public static void main(String[] args)
System. out. println( "全班同学开始考试: -共两个学生");
new Thread(() -> {
System. out. println(”第一个学生交卷, countDownLatch减1");
countDownLatch.countDown( );
}). start();
new Thread(() -> {
System. out. println(”第二个学生交卷,countDownLatch减1");
countDownLatch.countDown();
}). start();
try
countDownLatch.await();
} catch (InterruptedException e) {
e. printstackTrace();
System.out. println(“老师清点试卷,在此之前,只要一个学生没交, ”
+ "countDownLatch不为8, 不能离开考场”);
}
}
- 区别:
> CyclicBarrier 有一个线程未完成,其他线程都得等待,直到全部线程完成才可以后续准备
‘游戏加载,必须全部玩家都准备完成才可以游戏。’
> CountDownLatch 任意一个线程完成,该线程可以后续。所有线程都完成才可以执行最终逻辑
‘考试,任意一个考生考试完就可以离开,但必须全部考生都考试完毕,监考老师才可以最终收卷。’
3. Future
https://www.liaoxuefeng.com/wiki/1252599548343744/1306581155184674