倒计数器CountDownLatch
public static void main(String[] args) throws InterruptedException {
//总数是5、必须执行任务时,再使用!
CountDownLatch countDownLatch = new CountDownLatch(5);
for(int i=0;i<5;i++){
new Thread(()->{
System.out.println("同学" + Thread.currentThread().getName()+"正在走出教室...");
countDownLatch.countDown();
},String.valueOf(i)).start();
}
//计数器归0,然后向下访问
countDownLatch.await();
System.out.println("5位学生all走出去了。");
}
结果:
原理:
-
countDownLatch.countDown();//数量-1
-
countDownLatch.await();//计数器归0,然后向下访问
每次有线程调用CountDownLatch,数量-1;计数器变为0,继续执行。
加法计数器CyclicBarrier
/**
* 集齐12件黄金圣衣
* */
public static void main(String[] args) {
//计数器为12,才能集齐12件黄金圣衣
CyclicBarrier cyclicBarrier = new CyclicBarrier(12,()->{
System.out.println("集齐12件黄金圣衣!");
});
for(int i=1;i<=12;i++){
final int temp = i;
//lambada表达式能操作到i吗? 不能! solve:final类型的中间变量
new Thread(()->{
System.out.println("收集了第"+temp+"件圣衣");
try {
cyclicBarrier.await(); //等待计数为12
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
结果: