博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java并发编程_CountDownLanch(倒计数锁存器)应用场景
阅读量:6209 次
发布时间:2019-06-21

本文共 2815 字,大约阅读时间需要 9 分钟。

使用介绍:

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

用给定的计数 初始化 CountDownLatch。由于调用了 方法,所以在当前计数到达零之前, 方法会一直受阻塞。之后,会释放所有等待的线程, 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 。

CountDownLatch 是一个通用同步工具,它有很多用途。将计数 1 初始化的 CountDownLatch 用作一个简单的开/关锁存器,或入口:在通过调用 的线程打开入口前,所有调用 的线程都一直在入口处等待。用 N 初始化的 CountDownLatch 可以使一个线程在 N 个线程完成某项操作之前一直等待,或者使其在某项操作完成 N 次之前一直等待。

CountDownLatch 的一个有用特性是,它不要求调用 countDown 方法的线程等到计数到达零时才继续,而在所有线程都能通过之前,它只是阻止任何线程继续通过一个 。

 

举个例子:例如我们一群人(多个线程)要从北京一起到广州旅行,我们约定所有人都到达北京西站集合,当最后一个人到达北京西站的那一刻(计数器为0),我们才会一起同时进行下面的操作。

 

countdownLanch场景1:

示例用法: 下面给出了两个类,其中一组 worker 线程使用了两个倒计数锁存器

  • 第一个类是一个启动信号,在 driver 为继续执行 worker 做好准备之前,它会阻止所有的 worker 继续执行。
  • 第二个类是一个完成信号,它允许 driver 在完成所有 worker 之前一直等待。
1 class Driver { // ... 2    void main() throws InterruptedException { 3      CountDownLatch startSignal = new CountDownLatch(1); 4      CountDownLatch doneSignal = new CountDownLatch(N); 5  6      for (int i = 0; i < N; ++i) // create and start threads 7        new Thread(new Worker(startSignal, doneSignal)).start(); 8  9      doSomethingElse();            // don't let run yet10      startSignal.countDown();      // let all threads proceed11      doSomethingElse();12      doneSignal.await();           // wait for all to finish13    }14  }15 16  class Worker implements Runnable {17    private final CountDownLatch startSignal;18    private final CountDownLatch doneSignal;19    Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {20       this.startSignal = startSignal;21       this.doneSignal = doneSignal;22    }23    public void run() {24       try {25         startSignal.await();26         doWork();27         doneSignal.countDown();28 } catch (InterruptedException ex) {} // return;29    }30 31    void doWork() { ... }32  }

countdownLanch场景2:

另一种典型用法是,将一个问题分成 N 个部分,用执行每个部分并让锁存器倒计数的 Runnable 来描述每个部分,然后将所有 Runnable 加入到 Executor 队列。当所有的子部分完成后,协调线程就能够通过 await。(当线程必须用这种方法反复倒计数时,可改为使用 。)

 

1  class Driver2 { // ... 2    void main() throws InterruptedException { 3      CountDownLatch doneSignal = new CountDownLatch(N); 4      Executor e = ... 5  6      for (int i = 0; i < N; ++i) // create and start threads 7        e.execute(new WorkerRunnable(doneSignal, i)); 8  9      doneSignal.await();           // wait for all to finish10    }11  }12 13  class WorkerRunnable implements Runnable {14    private final CountDownLatch doneSignal;15    private final int i;16    WorkerRunnable(CountDownLatch doneSignal, int i) {17       this.doneSignal = doneSignal;18       this.i = i;19    }20    public void run() {21       try {22         doWork(i);23         doneSignal.countDown();24       } catch (InterruptedException ex) {} // return;25    }26 27    void doWork() { ... }28  }

内存一致性效果:线程中调用 countDown() 之前的操作 紧跟在从另一个线程中对应 await() 成功返回的操作。

转载于:https://www.cnblogs.com/zhangshiwen/p/5708886.html

你可能感兴趣的文章
win7+idea+maven搭建spark源码阅读环境
查看>>
解读route命令
查看>>
TableViewCell的封装(显示不同内容)
查看>>
驱动力的本源
查看>>
Spring-Spring Bean后置处理器
查看>>
CocosCreator检测动作执行完毕的方法~之一吧,应该= =
查看>>
以Lockbits的方式访问bitmap
查看>>
lvs+keepalived+bind实现负载均衡高可用智能dns【转】
查看>>
C++之C++的词法单位
查看>>
3D Touch
查看>>
从Java的角度看前端JS各种框架
查看>>
hosts,命令行前面的显示
查看>>
hdu1895(最小长方形)
查看>>
linux shell 自定义函数(定义、返回值、变量作用域)介绍
查看>>
20165334 第一次测试分析
查看>>
4、Oracle用户、权限、角色
查看>>
HTML特殊字符编码对照表
查看>>
aiohttp 基于异步库的请求替代品
查看>>
python写监控并发警报邮件
查看>>
高并发大流量专题---7、动态语言静态化
查看>>