计数器:CountDownLatch,CountDownLatch,CyclicBarrier

纳米机器人
• 阅读 1911
//    创建2个线程的线程池 
Executor executor =    Executors.newFixedThreadPool(2);
while(存在未对账订单){        
    //    计数器初始化为2        
    CountDownLatch latch = new CountDownLatch(2);        
    //    查询未对账订单        
    executor.execute(()->{
        pos = getPOrders();                
        latch.countDown();        
    });        
    //    查询派送单        
    executor.execute(()->{
        dos = getDOrders();                
        latch.countDown();        
    });                
    //    等待两个查询操作结束        
    latch.await();                
    //    执⾏对账操作        
    diff = check(pos, dos);        
    //    差异写⼊差异库        
    save(diff); 
}

计数器

CountDownLatch: 一个线程等待多个线程。

//定义一个初始值为2的计数器
CountDownLatch latch = new CountDownLatch(2);
//计数器-1
latch.countDown();
//线程等待,等待至计数结束。
latch.await();

CyclicBarrier:多个线程相互等待,等待结束执行回调。

//创建一个初始值为2得计数器    
CyclicBarrier barrier =     new CyclicBarrier(2, 
                    ()->{ executor.execute(()->check()); //回调函数                                                   
});    
//等待
barrier.await();
  • 调用await()计数器减1,同时等待计数器变为0。
  • 当计数器减到0时持有barrier.await()的线程会向下执行,同时调用barrier的回调函数。
  • 可以循环利用,具备自动重置功能。

总结:

CountDownLatch主要用来解决一个线程等待多个线程的场景,可以类比旅游团团长要等待所有的游客到齐才能去下一个景点;而CyclicBarrier是一组线程之间互相等待 ,更像 是几个驴友之间不离不弃。除此之外CountDownLatch的计数器是不能循环利用的,也就是说一旦计数器减到0,再有线程调用await(),该线程会直接通过。但CyclicBarrier的计数器是可以循环利用的,而且具备自动重置的功能,一旦计数器减到0会自动重置到你设置的初始值。除此之外,CyclicBarrier还可以设置回调函数。


码字不易如果对你有帮助请给个关注

爱技术爱生活 QQ群: 894109590

点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
java并发编程之二
CountDownLatch类  允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。  CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成了任务,然后在
Wesley13 Wesley13
3年前
java 线程篇 之CyclicBarrier、CountDownLatch、Semaphore
java提供了很多控制线程到达某一状态导致之前阻塞线程运行的函数,这些在控制任务执行提供了很大的便利,比如在zookper使用Semaphore实现分布式锁1、CountDownLatchcountDownLatch提供await(),CountDownLatch()来控制,前面我很多例子,使用这个来模拟多线程运行的,所以这里不过多介绍2
Wesley13 Wesley13
3年前
java多线程测试性能,总线程使用总时间。
前段时间在做java多线程,然后涉及到了一个效率的问题。  java多线程中,所有线程执行完毕,总共使用多少时间呢?importjava.util.concurrent.CountDownLatch;  countDwonlatch提供了最常用的一些测试方法。创建一个countDownLatch对象:CountDown
Wesley13 Wesley13
3年前
J.U.C体系进阶(四):juc
JavaJ.U.C体系进阶作者:Kerwin邮箱:806857264@qq.com说到做到,就是我的忍道!jucsync同步器框架同步器名称作用CountDownLatch倒数计数器,构造时设定计数值,当计数值归零后,所有阻塞线程恢复执行;其内部实现
Stella981 Stella981
3年前
CountDownLatch、CyclicBarrier 的对比
CountDownLatch、CyclicBarrier都可以用于:在多线程异步执行过程中,执行预定的流程后唤醒指定的线程进行相应的操作.区别:1,CountDownLatch唤醒过一次,就废弃了;CyclicBarrier可以重复之前的预定流程,反复唤醒。2,CountDownLatch可用于唤醒主线程,异步线程\任意线程,
Wesley13 Wesley13
3年前
Java多线程并发控制工具CountDownLatch,实现原理及案例
闭锁(CountDownLatch)是Java多线程并发中的一种同步器,它是JDK内置的同步器。通过它可以定义一个倒计数器,当倒计数器的值大于0时,所有调用await方法的线程都会等待。而调用countDown方法则可以让倒计数器的值减一,当倒计数器值为0时所有等待的线程都将继续往下执行。闭锁的主要应用场景是让某个或某些线程在某个运行节点上等待N个条件都
Wesley13 Wesley13
3年前
Java CyclicBarrier介绍
CyclicBarrier(周期障碍)类可以帮助同步,它允许一组线程等待整个线程组到达公共屏障点。CyclicBarrier是使用整型变量构造的,其确定组中的线程数。当一个线程到达屏障时(通过调用CyclicBarrier.await()),它会被阻塞,直到所有线程都到达屏障,然后在该点允许所有线程继续执行。与CountDownLatch不同的
Stella981 Stella981
3年前
CountDownLatch和CylicBarrier以及Semaphare你使用过吗
CountDownLatch是什么CountDownLatch的字面意思:倒计时门栓它的功能是:让一些线程阻塞直到另一些线程完成一系列操作后才唤醒。它通过调用await方法让线程进入阻塞状态等待倒计时0时唤醒。它通过线程调用countDown方法让倒计时中的计数器减去1,当计数器为0时,会唤醒哪些因为调用了await而阻塞的线程。
Wesley13 Wesley13
3年前
Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore , Condition
http://www.importnew.com/21889.html(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.importnew.com%2F21889.html)1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不
Stella981 Stella981
3年前
CountDownLatch
CountDownLatch\TOC\一.介绍CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它们都存在于java.util.concurrent包下。Co