Java多线程CyclicBarrier学习

    xiaoxiao2023-12-04  205

    CyclicBarrier是多线程并发控制实用工具

     

    CyclicBarrier初始化时规定一个数目,然后调用await()方法进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续执行。await() 方法没被调用一次,计数便会减少1,并阻塞住当前线程。当计数减至0时,阻塞解除,所有在此 CyclicBarrier 上面阻塞的线程开始运行。CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。CyclicBarrier可以接收一个参数作为barrierAction,就是当计数器一次计算完成后,程序会执行的动作。如果你想学习java可以来这个群,首先是五三二,中间是二五九,最后是九五二,里面有大量的学习资料可以下载。  

     

    Java代码   import java.util.concurrent.BrokenBarrierException;   import java.util.concurrent.CyclicBarrier;   import java.util.concurrent.ExecutorService;   import java.util.concurrent.Executors;   /**   *    * @author InJavaWeTrust   *   */   public class Orange {              public static class PickOrange implements Runnable {                      private int i;           private CyclicBarrier cb;                      public PickOrange(int i, CyclicBarrier cb) {               this.i = i;               this.cb = cb;           }                      public void run() {               try {                   pick();                   cb.await(); // 等待所有橘子采摘完毕                   box();                   cb.await(); // 等待所有橘子装箱完毕               } catch (InterruptedException e) {                   e.printStackTrace();               } catch (BrokenBarrierException e) {                   e.printStackTrace();               }           }                      public void pick() {               System.out.println("采摘第" + i +"个橘子完成!");           }                      public void box() {               System.out.println("第" + i + "个橘子装箱完成!");           }       }              public static void main(String[] args) {           CyclicBarrier cb = new CyclicBarrier(5);           ExecutorService exec = Executors.newFixedThreadPool(5);           for (int i = 1; i <= 5; i++) {               exec.submit(new Thread(new PickOrange(i, cb)));           }           exec.shutdown();       }      }  

           结果:

    Java代码   采摘第2个橘子完成!   采摘第1个橘子完成!   采摘第5个橘子完成!   采摘第4个橘子完成!   采摘第3个橘子完成!   3个橘子装箱完成!   2个橘子装箱完成!   1个橘子装箱完成!   5个橘子装箱完成!   4个橘子装箱完成!   相关资源:java多线程之CyclicBarrier的使用方法
    最新回复(0)