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()设置超时时间;