java countDownLatch概念

  • countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。
  • 是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。

例子

班长最后走锁门的例子,有6个同学上晚自习,班长必须等6个同学都走完才能锁门,不然把其中一个锁教室了班长就等着被骂娘。

代码实现

  • 一般情况,可能出现班长把其中几个人锁教室了,这样时不行的
  1. package com.bowen;
  2. public class CountDownLatchDemo {
  3. public static void main(String[] args) {
  4. for (int i = 1; i <= 6; i++) {
  5. new Thread(()->{
  6. System.out.println(Thread.currentThread().getName()+" 同学上完晚自习离开");
  7. },String.valueOf(i)).start();
  8. }
  9. System.out.println(Thread.currentThread().getName()+" 班长锁门离开");
  10. }
  11. }
  12. //结果
  13. //6 同学上完晚自习离开
  14. //3 同学上完晚自习离开
  15. //2 同学上完晚自习离开
  16. //1 同学上完晚自习离开
  17. //main 班长锁门离开
  18. //5 同学上完晚自习离开
  19. //4 同学上完晚自习离开
  • 修改后,一定等到6个同学都走完,班长才锁门
  1. package com.bowen;
  2. import java.util.concurrent.CountDownLatch;
  3. public class CountDownLatchDemo {
  4. public static void main(String[] args) throws InterruptedException {
  5. CountDownLatch countDownLatch = new CountDownLatch(6);//初始化 cout为6
  6. for (int i = 1; i <= 6; i++) {
  7. new Thread(()->{
  8. System.out.println(Thread.currentThread().getName()+" 同学上完晚自习离开");
  9. countDownLatch.countDown();//走一个减一
  10. },String.valueOf(i)).start();
  11. }
  12. countDownLatch.await();//减到0才不会再等待
  13. System.out.println(Thread.currentThread().getName()+" 班长锁门离开");
  14. }
  15. }
  16. //结果
  17. //6 同学上完晚自习离开
  18. //5 同学上完晚自习离开
  19. //2 同学上完晚自习离开
  20. //1 同学上完晚自习离开
  21. //4 同学上完晚自习离开
  22. //3 同学上完晚自习离开
  23. //main 班长锁门离开