计数器:CountDownLatch,循环栅栏:CyclicBarrier

//	创建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还可以设置回调函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘彦青-Yannis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值