写在前面:
CountDownLatch类在java.util.Concurrent包下在Java API中,是一个同步工具类,对CountDownLatch类的描述是允许一个或者多个线程等待,直到其他线程执行完后再执行。
CountDownLatch类可以使其他线程完成各自的工作后,再执行。比如:在应用程序中,main线程希望在所有框架服务的线程已经启动完所有框架服务之后,再执行。
我们先来看一下没有使用CountDownLatch类的例子:
package countDownLatchDemo;
public class CountDownLatchDemo1 {
public static void main(String[] args) throws Exception {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread1");
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread2");
}
});
thread1.start();
thread2.start();
thread1.join();
thread2.join();
System.out.println("线程1,线程2全部输出结束");
}
}
控制台输出结果:
thread1
thread2
线程1,线程2全部输出结束
上面的代码,使用了Join方法,首先让主线程,线程2停止执行,等待线程1执行完毕,然后线程2继续执行,主线程等待线程2结束。
注:在线程1调用Join方法之后,开始执行线程1,在线程1执行结束后,JVM会自动调用this.notifyAll()方法(这段代码由于是JVM实现,所以在JDK中查看不到)
CountDownLatch
- 构造函数:
public CountDownLatch(int count) {
if (count < 0) throw new IllegalArgumentException("count < 0");
this.sync = new Sync(count);
}
我们在创建CountDownLatch实例时,我们会传入一个count参数,这个参数表示,主线程会等到count个线程,或者是等待count个方法执行完毕。
- countDown方法:
public void countDown() {
sync.releaseShared(1);
}
当CountDownLatch实例每调用一次countDown方法的时候,构造函数的count参数就会-1,并且CountDownLatch的await方法会阻塞当前线程直到count减为0。
下面我们通过一段测试代码来看一下CountDownLatch的使用:
package countDownLatchDemo;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchTest {
static CountDownLatch c = new CountDownLatch(2);//初始化CountDownLatch会等待2个线程或者2个方法执行
public static void main(String[] args) throws Exception {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("1");
c.countDown();
System.out.println("2");
c.countDown();
}
}).start();
c.await();
System.out.println("3");
}
}
上述的代码,程序执行方式:
(1)当CoutLatch方法调用了await方法后,主线程会等待子线程结束后,再执行打印"3"。
(2)在子线程中,第一个c.countDown方法调用后,线程内就会等待"1"先输出,然后c对象构造函数中的count-1.
(3)第二个c.countDown方法调用后,线程内就会等待"2"先输出,然后c对象构造函数中的count-1=0。
(4)此时结束等待,开始继续执行主线程。
控制台输出结果:
1
2
3