CountDownLatch(减法计数器)-CyclicBarrier(加法计数器)

1.CountDownLatch

允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。
public CountDownLatch(int count)构造一个以给定计数
CountDownLatch CountDownLatch。
参数
count -的次数 countDown()必须调用之前线程可以通过 await()
异常
IllegalArgumentException - 如果 count为负数

public void countDown()

减少锁存器的计数,如果计数达到零,释放所有等待的线程。
如果当前计数大于零,则它将递减。 如果新计数为零,则所有等待的线程都将被重新启用以进行线程调度。
如果当前计数等于零,那么没有任何反应。
public void await()

throws InterruptedException

导致当前线程等到锁存器计数到零,除非线程是interrupted 。
如果当前计数为零,则此方法立即返回。

示例:

CountDownLatch countDownLatch = new CountDownLatch(10);
for(int i = 0;i<10;i++){
    new Thread(()->{
        System.out.println(Thread.currentThread().getName()+"***");
        countDownLatch.countDown();//数量-1
    },String.valueOf(i)).start();
}
countDownLatch.await();     //等待计数器变为0结束
System.out.println("end");

2.CyclicBarrier

允许一组线程全部等待彼此达到共同屏障点的同步辅助。 循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。 屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。
A CyclicBarrier支持一个可选的Runnable命令,每个屏障点运行一次,在派对中的最后一个线程到达之后,但在任何线程释放之前。 在任何一方继续进行之前,此屏障操作对更新共享状态很有用。

await如果当前线程不是最后一个线程,那么它被禁用以进行线程调度,并且处于休眠状态,直到发生下列事情之一await

最后一个线程到达; 要么
一些其他线程当前线程为interrupts ; 要么
一些其他线程interrupts其他等待线程之一; 要么
一些其他线程在等待屏障时超时; 要么
其他一些线程在这个屏障上调用reset() 。
示例`

CyclicBarrier cyclicBarrier = new CyclicBarrier(8);   //线程达到8才结束
        for (int i = 0;i<8;i++){
            new Thread(()->{
                System.out.println(Thread.currentThread().getName()+"***");
                try {
                    cyclicBarrier.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }).start();
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值