计数器,允许一个或多个线程等待直到其他线程中执行的一组操作完成的同步辅助。线程每完成一个就记录一个(计数减一),当计数减为0的时候,才能执行await后的操作。
CountDownLatch可以当做是一个共享锁。

源码分析

await():

导致当前线程等到锁计数器变为0,除非线程是interrupted

await(long timeout,TimeUnit unit)

使当前线程等待直到锁存器计数到0位置,除非线程为interrupted或指定的等待时间过去

countDoown()

减少锁存器的计数,如果计数达到零,释放所有等待的线程。

getCount()

返回当前计数

使用场景

  1. private static CountDownLatch countDown = new CountDownLatch(3);
  2. public static void main(String[] args){
  3. System.out.println(countDown.getCount());
  4. new Thread(()->{
  5. try{
  6. System.out.println(Thread.currentThread().getName() + "正在执行");
  7. System.out.println(Thread.currentThread().getName() + "执行完毕");
  8. countDown.countDown();
  9. System.out.println(Thread.currentThread().getName() + ":" + countDown.getCount());
  10. }catch(Exception e){
  11. }
  12. },"Thread~0").start();
  13. new Thread(()->{
  14. try{
  15. System.out.println(Thread.currentThread().getName() + "正在执行");
  16. System.out.println(Thread.currentThread().getName() + "执行完毕");
  17. countDown.countDown();
  18. System.out.println(Thread.currentThread().getName() + ":" + countDown.getCount());
  19. }catch(Exception e){
  20. }
  21. },"Thread~1").start();
  22. new Thread(()->{
  23. try{
  24. System.out.println(Thread.currentThread().getName() + "正在执行");
  25. System.out.println(Thread.currentThread().getName() + "执行完毕");
  26. countDown.countDown();
  27. System.out.println(Thread.currentThread().getName() + ":" + countDown.getCount());
  28. }catch(Exception e){
  29. }
  30. },"Thread~2").start();
  31. try {
  32. System.out.println("等待两个子线程执行完毕");
  33. countDown.await();
  34. System.out.println("两个子线程执行完毕");
  35. System.out.println("继续执行主线程");
  36. } catch (InterruptedException e) {
  37. e.printStackTrace();
  38. }
  39. }