CountDownLatch:顾名思义为倒数计数器,主要作用是用于一个线程等待其他线程完成后执行。
其构造方法 public CountDownLatch(int count),中的count是指需要等待的线程数。
package demo.countdown;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchTest {
private static CountDownLatch cd = new CountDownLatch(3);
static class ThreadA extends Thread{
String name;
public ThreadA(String name) {
super();
this.name = name;
}
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Thread A running...."+name);
cd.countDown();
}
}
static class ThreadB extends Thread{
String name;
public ThreadB(String name) {
super();
this.name = name;
}
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Thread B running...."+name);
cd.countDown();
}
}
static class ThreadC extends Thread{
String name;
public ThreadC(String name) {
super();
this.name = name;
}
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread C running...."+name);
cd.countDown();
}
}
public static void main(String[] args) throws InterruptedException {
new ThreadA("WorkdA").start();
new ThreadB("WorkdB").start();
new ThreadC("WorkdC").start();
cd.await();
System.out.println("子线程已工作完成.....");
}
}
首先定义了一个CountDownLatch其中实例时定义了count=3,意思就是等待三个线程完成后,主线程才执行(这里的主线程就是其他或者一个线程)A B C三个线程就是子线程
子线程中调用一个countDown的方法,这个方法就是将count-1.
主线程调用await方法,将主线程阻塞在这里,直到count=0时再调用。
这里需要注意的是,如果子线程的数大于count的话,那么主线程会一直阻塞在那,这里不难理解,因为假设子线程的数是2,但是count=3,这样count永远不会是0。所以会阻塞在这里。
countDownLatch主要场景是我们实例化一些配置或者对象后,再执行我们后面的业务时,我们就可以用这个工具类来实现