Java多线程之CountDownLatch和CyclicBarrier同步屏障的使用

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6558349.html 

    一:CountDownLatch

        CountDownLatch是一个执行 完成任务线程数 的 倒数计数器。我们考虑这种情况:士兵晨练,必须全队士兵集合完毕才开始跑步。用程序描述就:在晨练线程中,逐个启动士兵的集合线程,执行集合动作;等所有士兵的集合线程都执行完毕,才能继续晨练线程执行跑步操作。那么我们怎么快速地统计已经集合的士兵线程数,以及怎样在集合完毕后第一时间启动跑步呢?这里就需要用到CountDownLatch。

         1:首先,我们在晨练线程中创建一个CountDownLatch:static final CountDownLatch countDownLatch = new CountDownLatch(10);//构造参数说明有多少个需要完成的线程

         2:在每个士兵的集合线程中,通过:countDownLatch.countDown();  //说明当前线程已经执行到屏障处,把倒数计数器值减1

         3:在晨练线程中,通过:countDownLatch.await();  //暂时挂起线程,等待倒数计数器为0时自动唤醒,继续执行

    二:CyclicBarrier

        与countDownLatch相反,这是一个加法计数器的同步屏障,并且可以重复使用。它在每个线程中设置屏障点,当一个线程执行到屏障点时就需要停下,计数器+1,直到计数器达到创建时指定值时执行相应的响应线程,并且全部线程继续执行,直到下一个屏障处等待或者执行完毕。

        1:创建CyclicBarrier同步屏障对象,设置屏障处计数值以及达到该值后执行什么响应动作线程:

             CyclicBarrier barrier = new CyclicBarrier(n, new BarrierDone_Run());

        2:在BarrierDone_Run线程中,定义  执行到屏障处而停顿的线程数达到设定值  时,启动响应线程执行后续操作。

        3:逐个启动工作线程,在工作线程的run()方法中,通过: barrier.await();  //设定屏障,当线程执行到这步时挂起,直到计数器达到设定值时才继续执行

 

    三:比较

    1:CountDownLatch是把主干线程挂起,在任务线程中进行倒数计数,直到任务线程执行完才唤醒主干线程继续执行;

         CyclicBarrier是把任务线程挂起,直到所有任务线程执行到屏障处再放行继续执行;

    2:CountDownLatch达到屏障放行标准后放行的是主干线程;

         CyclicBarrier达到屏障放行标准后放行的是任务线程,并且还会额外地触发一个达到标准后执行的响应线程;

原文地址:https://www.cnblogs.com/ygj0930/p/6558349.html