多线程CountDownLatch,CyclicBarrier简单理解

public class CountDownLatchFunc1 implements Runnable {
    public CountDownLatch c;

    public CountDownLatchFunc1(CountDownLatch c) {
        this.c = c;
    }

    @Override
    public void run() {
        c.countDown();
        System.out.println(Thread.currentThread().getName()+"==============>>ok"+c.getCount());
    }

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch c = new CountDownLatch(6);
        CountDownLatchFunc2 c2=new CountDownLatchFunc2();
        CountDownLatchFunc1 c1=new CountDownLatchFunc1(c);

        for (int i = 0 ;i<10;i++){
            Thread t = new Thread(c1);
            c.getCount();//获取当前调度的线程值
            t.start();
        }
        //:理解,达不到条件的时候,wait下面的线程属于阻塞线程,同理,其余的线程调度不会出现在0以上
        c.await();
        Thread t2 = new Thread(c2,"线程3");
        t2.start();
        System.out.println("执行主线程");
    }

内部类Sync同样继承AQS;
AQS的state代表count;
初始化使用计数器count;
count代表多个线程执行或者某个操作执行次数;
countDown()方法将会将count-1;
count为0将会释放所有等待线程;
await方法将会阻塞直到count为0;
CountDownLatch是一次性的,计数器的值只能在构造方法中初始化一次,之后没有任何机制再次对其设置值,当CountDownLatch使用完毕后,它不能再次被使用。
count不为0,但是等待时间过去将会返回false。

中断情况:

   如果当前计数大于零,则出于线程调度目的,当前线程将禁用,并处于休眠状态,直到发生以下三种情况之一:

1.countDown方法调用导致count减数为0;

2.别的线程中断了当前线程

3.指定等待时间过去


CyclicBarrier:

           简单理解:调用await让线程进入等待序列,如果达到指定的值的适合,在执行所有等待中线程

          

public CyclicBarrier c;

public CyclicBarrierFunc1(CyclicBarrier c) {
    this.c = c;
}

@Override
public void run() {

    try {
        System.out.println(Thread.currentThread().getName()+"开始等待");
        c.await();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (BrokenBarrierException e) {
        e.printStackTrace();
    }
    System.out.println(Thread.currentThread().getName()+"==============>>ok,结束等待");
}
public static void main(String[] args) throws InterruptedException {

   CyclicBarrier c=new CyclicBarrier(2);
   CyclicBarrierFunc1 c1=new CyclicBarrierFunc1(c);
   for (int i = 0;i<10;i++) {
      Thread t1 = new Thread(c1, "一线程"+i);
      Thread.sleep(1000);
      t1.start();
   }
}

执行效果:

   一线程0开始等待
一线程1开始等待
一线程1==============>>ok,结束等待
一线程0==============>>ok,结束等待
一线程2开始等待
一线程3开始等待
一线程3==============>>ok,结束等待
一线程2==============>>ok,结束等待
一线程4开始等待
一线程5开始等待
一线程5==============>>ok,结束等待
一线程4==============>>ok,结束等待

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

平常心丷

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

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

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

打赏作者

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

抵扣说明:

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

余额充值