文档章节

【java.util.concurrent】CountDownLatch解析

阿阿阿阿阿局
 阿阿阿阿阿局
发布于 2016/08/09 11:37
字数 548
阅读 15
收藏 0

一、概念

被用来同步一个或多个线程任务,强制他们等待直到由其他线程完成正在执行的一组操作。

可以向CountDownLatch对象设置一个计数值,可以通过在该对象上调用countDown()方法来减小该计数值,任何在该对象上调用wait()方法都将被阻塞,直至计数值为0,。

CountDownLatch被设计为只触发一次且计数值不能重置,不同于CyclicBarrier,能够循环重置计数值。

二、代码示例

public class CountDownLatchTest {
	final static SimpleDateFormat sdf = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm:ss");

	public static void main(String[] args) throws InterruptedException {
		CountDownLatch latch = new CountDownLatch(2);// 两个工人的协作
		Worker worker1 = new Worker("zd", 1000, latch);
		Worker worker2 = new Worker("zt", 2000, latch);
		worker1.start();
		worker2.start();
		latch.await();// 等待所有工人完成工作
		System.out.println("all work done at " + sdf.format(new Date()));
	}

	static class Worker extends Thread {
		String workerName;
		int workTime;
		CountDownLatch latch;

		public Worker(String workerName, int workTime, CountDownLatch latch) {
			this.workerName = workerName;
			this.workTime = workTime;
			this.latch = latch;
		}

		public void run() {
			try{
				System.out.println("Worker " + workerName + " do work begin at "
						+ sdf.format(new Date()));
				doWork();// 工作了
				System.out.println("Worker " + workerName + " do work complete at "
						+ sdf.format(new Date()));
			}finally{
				if(latch!=null){
					latch.countDown();// 工人完成工作,计数器减一
				}
			}
		}

		private void doWork() {
			try {
				Thread.sleep(workTime);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

结果展示:

三、在实时系统中的使用场景

原文链接:http://www.importnew.com/15731.html 

  1. 实现最大的并行性:有时我们想同时启动多个线程,实现最大程度的并行性。例如,我们想测试一个单例类。如果我们创建一个初始计数为1的CountDownLatch,并让所有线程都在这个锁上等待,那么我们可以很轻松地完成测试。我们只需调用 一次countDown()方法就可以让所有的等待线程同时恢复执行。
  2. 开始执行前等待n个线程完成各自任务:例如应用程序启动类要确保在处理用户请求前,所有N个外部系统已经启动和运行了。
  3. 死锁检测:一个非常方便的使用场景是,你可以使用n个线程访问共享资源,在每次测试阶段的线程数目是不同的,并尝试产生死锁。

 

若有错误望指正,仅作为复习记录。 

© 著作权归作者所有

共有 人打赏支持
阿阿阿阿阿局
粉丝 10
博文 48
码字总数 61219
作品 0
成都
并发辅助类CountDownLatch的使用和源码

CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他10个线程的任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现...

激情的狼王丶21
01/11
0
0
使用CountDownLatch协调子线程

从JDK 1.5之后,在java.util.concurrent包下引入了好多的处理多线程的工具类,本文将介绍CountDownLatch工具类,并采用这个工具类给出一个实例。 CountDownLatch工具类介绍 CountDownLatch描...

王孟君
2016/11/05
322
2
Java并发编程:CountDownLatch、CyclicBarrier和Semaphore

Java并发编程:CountDownLatch、CyclicBarrier和Semaphore   在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们...

明舞
2015/09/01
0
0
【java.util.concurrent】CyclicBarrier解析

一、概念 有点类似CountDownLatch类,只是CountDownLatch只触发一次事件,而CyclicBarrier可以多次重用。如果你希望多线程并行执行任务,需等待所有线程均已完成现步骤之后再进入下一步骤,直...

阿阿阿阿阿局
2016/08/09
22
0
java中的 CountDownLatch

1、在java.util.concurrent包下 在java1.5被引入的 一起引入的并发工具类CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue 2、CountDownLatch 使一个线程等其他线程完成各自的工...

职业搬砖20年
05/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

初级开发-编程题

` public static void main(String[] args) { System.out.println(changeStrToUpperCase("user_name_abc")); System.out.println(changeStrToLowerCase(changeStrToUpperCase("user_name_abc......

小池仔
34分钟前
2
0
现场看路演了!

HiBlock
昨天
6
0
Rabbit MQ基本概念介绍

RabbitMQ介绍 • RabbitMQ是一个消息中间件,是一个很好用的消息队列框架。 • ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的s...

寰宇01
昨天
6
0
官方精简版Windows10:微软自己都看不过去了

微软宣布,该公司正在寻求解决方案,以减轻企业客户的Windows 10规模。该公司声称,企业客户下载整个Windows 10文件以更新设备既费钱又费时。 微软宣布,该公司正在寻求解决方案,以减轻企业...

linux-tao
昨天
6
0
TypeScript基础入门之JSX(二)

转发 TypeScript基础入门之JSX(二) 属性类型检查 键入检查属性的第一步是确定元素属性类型。 内在元素和基于价值的元素之间略有不同。 对于内部元素,它是JSX.IntrinsicElements上的属性类型...

durban
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部