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()方法,恢复执行自己的任务。相关文章推荐
- Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭
- Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭
- Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭
- Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭
- Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭
- Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭
- Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭
- Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭
- Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭
- Java并发编程之——同步器工具类(semaphores, barriers, CountDownLatch,exchangers)
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
- Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
- 《Java 7 并发编程指南》学习概要 (3)Semaphore, CountDownLatch, CyclicBarrier , Phaser, Exchanger
- Java并发编程之CountDownLatch
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
- java并发编程之CountDownLatch与CyclicBarrier
- java并发编程之CountDownLatch
- Java并发编程之CountDownLatch