CountDownLatch使用

133 阅读1分钟

1、什么是CountDownLatch

CountDownLatch是jdk中juc包下面的一个工具类,是一个同步计数器,可以使一个或者多个线程执行完毕之后,再接着往下执行,它通过一个计数器来实现,初始值为线程的数量,每当一个线程执行后可以使其减1,当计数器为0的时候,可以使等待的线程接着执行

2、CountDownLatch方法使用

1、countDown(),使初始化的线程数减1;

2、await(),使线程等待初始化计数器变为0后开始执行后面的程序,支持设置时间;

3、getCount(),获取计数器的值

3、 CountDownLatch例子

1、以下程序是CountDownLatch使用例子:

import java.util.concurrent.CountDownLatch;

public class CountDownLatchDemo {

public static void main(String[] args) {
  CountDownLatch countDownLatch = new CountDownLatch(10);
  for (int i = 0; i < 10; i++) {
    Thread thread = new Thread(() -> {
      try {
        System.out.println("线程:" + Thread.currentThread().getName() + ":开始执行");
      } catch (Exception e) {
        e.printStackTrace();
      } finally {
        countDownLatch.countDown();
      }
    });
    thread.start();
  }
  try {
    countDownLatch.await();
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
  System.out.println("==============主线程执行结束");
}
}

4、 CountDownLatch使用注意

(1)CountDownLatch在使用的时候,记得在try{}catch()finally{}中的finally中减1,防止程序发生异常的时候,还没执行到线程数减1,await()方法一直在等待,这时候程序就得不到释放;

public class CountDownLatchDemo {

public static void main(String[] args) {
  CountDownLatch countDownLatch = new CountDownLatch(10);
  for (int i = 0; i < 10; i++) {
    final int a = i;
    Thread thread = new Thread(() -> {
      try {
        System.out.println("线程:" + Thread.currentThread().getName() + ":开始执行");
        if (a == 2) {
          int b = 1 / 0;
        }
        countDownLatch.countDown();
      } catch (Exception e) {
        e.printStackTrace();
      }
    });
    thread.start();
  }
  try {
    countDownLatch.await();
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
  System.out.println("==============主线程执行结束");
}
}

(2)还可以await()设置超时时间;