JUC练习9——计数器

1,CountdownLatch适用于所有线程执行结束后了(指定的事件都发生了),放开*,目标事件(线程)执行。例如:我制作一个汽车,每个零件的制作是一个进程,组装是一个进程,需要等到所有的零件制作进程执行结束,才会触发将汽车组装进程。

而CyclicBarrier则适合让所有线程在同一点同时执行,例如:运动员需要都集合准备好,才能开跑,开跑后,所有的运动员一起跑步

2,CountdownLatch利用继承AQS的共享锁来进行线程的通知,利用CAS来进行--,而CyclicBarrier则利用ReentrantLock的Condition来阻塞和通知线程

 

示例代码

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;

public class JucTest9
{
    public static void main(String[] args) throws Exception
    {
        //cyclicBarrierTest();
        countDownLatchTest();
    }

    static void cyclicBarrierTest()throws Exception
    {
        CyclicBarrier cyclicBarrier = new CyclicBarrier(4,()->{
            System.out.println("4人组集合完毕,开枪");
        });
        for(int i=1;i<=4;i++){
            new Thread(()->
            {
                System.out.println(Thread.currentThread().getName()+"到队集合,等待跑步出发");
                try
                {
                    cyclicBarrier.await();
                    System.out.println(Thread.currentThread().getName()+"跑步");
                }catch (Exception e)
                {
                    e.printStackTrace();
                }
            },"A"+i).start();
        }
    }

    static void countDownLatchTest() throws Exception
    {
        //指定一个数值进行是、计数,使用await()进行等待计算器归零后,继续向下执行
        CountDownLatch countDownLatch = new CountDownLatch(4);
        for(int i=1;i<=4;i++){
            new Thread(()->
            {
                System.out.println(Thread.currentThread().getName()+"汽车零件开始准备");
                countDownLatch.countDown();
                System.out.println(Thread.currentThread().getName()+"汽车零件准备完成");
            },"A"+i).start();
        }
        countDownLatch.await();
        System.out.println("汽车进行组装");
    }
}

  

上一篇:Java学习-第21天


下一篇:C#进阶——从应用上理解异步编程的作用(async / await)