【java.util.concurrent】CountDownLatch解析
【java.util.concurrent】CountDownLatch解析
阿阿阿阿阿局 发表于2年前
【java.util.concurrent】CountDownLatch解析
  • 发表于 2年前
  • 阅读 15
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】买域名送云解析+SSL证书+建站!>>>   

一、概念

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

可以向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个线程访问共享资源,在每次测试阶段的线程数目是不同的,并尝试产生死锁。

 

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

标签: CountDownLatch
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 12
博文 45
码字总数 61219
×
阿阿阿阿阿局
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: