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

写在前面:

       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

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值