您的位置:首页 > 编程语言 > Java开发

Java并发编程基础---(3)CountDownLatch类总结

2018-03-05 23:00 549 查看
写在前面:
       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
    
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  并发编程