CyclicBarrier的使用

来源:互联网 发布:org.apache.shiro 编辑:程序博客网 时间:2024/04/30 05:54

CyclicBarrier把所有的线程都阻塞在一个阀门位置cyclicbarrier.awaite(),然后等到等待的线程数到达预设的值,就打开这个阀门。记得是阻塞线程,不是阻塞操作,在同一个线程使劲掉await是没什么效果的。

public class CyclicBarrierTest{      private final int STUDENT_COUNT = 10;      private final CyclicBarrier cb = new CyclicBarrier(STUDENT_COUNT, new Runnable() {        @Override        public void run() {            System.out.println("人到齐了,开门....");        }    });      public void goHome() throws InterruptedException, BrokenBarrierException{          System.out.println(Thread.currentThread().getName()+"已刷卡,等待开门回家~");          cb.await();          System.out.println(Thread.currentThread().getName() + "放学回家~");       }      public static void main(String[] args) {          CyclicBarrierTest ct = new CyclicBarrierTest();        for(int i =0;i<ct.STUDENT_COUNT;i++){            new Thread("学生"+i+" "){                @Override                public void run() {                    try {                        ct.goHome();                    } catch (InterruptedException | BrokenBarrierException e) {                        e.printStackTrace();                    }                }            }.start();        }    }}
package com.zhy.concurrency.cyclic;  import java.util.concurrent.BrokenBarrierException;  import java.util.concurrent.CyclicBarrier;  /**  * 改造后的门禁系统  *   * @author zhy  *   */  public class CyclicBarrierTest23  {      /**      * 学生总数      */      private  final int STUDENT_COUNT = 12;      /**      * 每3个人一组出门      */      final CyclicBarrier barrier = new CyclicBarrier(2,              new Runnable()              {                  @Override                  public void run()                  {                      System.out.println("有2个学生到齐了,放行....");                  }              });      public void goHome() throws InterruptedException, BrokenBarrierException      {          System.out.println(Thread.currentThread().getName() + "已刷卡,等待开门回家~");          barrier.await();      }      public static void main(String[] args) throws InterruptedException,              BrokenBarrierException      {          final CyclicBarrierTest23 instance = new CyclicBarrierTest23();          /**          * 每个线程代表一个学生          */          for (int i = 0; i < instance.STUDENT_COUNT; i++)          {              new Thread("学生" + i +"  " )              {                  public void run()                  {                      try                      {   Thread.sleep(1000);                        instance.goHome();                      } catch (InterruptedException e)                      {                          e.printStackTrace();                      } catch (BrokenBarrierException e)                      {                          e.printStackTrace();                      }                  };              }.start();          }      }  }  
0 0
原创粉丝点击