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

Java并发编程:闭锁CountDownLatch之一起回家

2017-11-26 15:03 821 查看

一、CountDownLatch的特性

CountDownLatch也叫闭锁它是一个同步工具类,它的一个特性是:闭锁相当于一道门,所有线程都没到达之前,都是关闭状态的。直到所有的线程都完成各自的任务后,闭锁就会打开,并且一直处于打开状态。举个常见的例子来说,同学聚会,我们需要等到所有的人都到了,聚会才能开始。

二、CountDownLatch实现原理

CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成自己的任务后,计数器的值就会减一。当计数器值到达0时,它表示所有的线程已经完成了任务,然后再闭锁上等待的线程就可以恢复执行任务。

三、代码实现

例子:小明、小刚、小红、三个人打算放学后,约定一起回家。因此,我模拟了三个并行线程。

未使用闭锁的情况下:

public class CountDownLatchTest {

public void run() {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("小明到达了校园门口");
}
}).start();

new Thread(new Runnable() {
@Override
public void run() {
System.out.println("小红到达了校园门口");
}
}).start();

new Thread(new Runnable() {
@Override
public void run() {
System.out.println("小刚到达了校园门口");
}
}).start();

System.out.println("三个都到了,然后一起回家!");

}

public static void main(String[] args){
CountDownLatchTest test = new CountDownLatchTest();
test.run();
}

}


输出结果:

小红到达了校园门口
小明到达了校园门口
三个都到了,然后一起回家!
小刚到达了校园门口


通过上面的例子可以看出,结果乱套了。我们要的结果是三个人都到达门口这一个条件,方能继续下一个动作的执行。接下来使用闭锁的情况下:

public class CountDownLatchTest {
private CountDownLatch latch = new CountDownLatch(3);

public void run() {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("小明到达了校园门口");
latch.countDown();
}
}).start();

new Thread(new Runnable() {
@Override
public void run() {
System.out.println("小红到达了校园门口");
latch.countDown();
}
}).start();

new Thread(new Runnable() {
@Override
public void run() {
System.out.println("小刚到达了校园门口");
latch.countDown();
}
}).start();

try {
latch.await();
System.out.println("三个都到了,然后一起回家!");
} catch (InterruptedException e) {
e.printStackTrace();
}

}

public static void main(String[] args){
CountDownLatchTest test = new CountDownLatchTest();
test.run();
}

}


输出结果:

小明到达了校园门口
小红到达了校园门口
小刚到达了校园门口
三个都到了,然后一起回家!


四、总结

CountDownLatch类的构造函数中的计数值(count)实际上就是闭锁需要等待的线程数量,这个值只能被设置一次,而且CountDownLatch没有提供任何机制去重新设置这个计数值。与CountDownLatch的第一次交互是主线程等待其他线程。主线程必须在启动其他线程后立即用CountDownLatch.await()方法。这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务。其他的线程通过调用闭锁对象,即CountDownLatch的CountDown()方法,每调用之后,CountDownLatch构造函数里的count就会减1。当count为0时,表示其他线程任务已都完成,主线程就能通过await()方法,恢复执行自己的任务。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: