我之见--java 多线程CyclicBarrier

来源:互联网 发布:生态安全调查数据库 编辑:程序博客网 时间:2024/05/16 17:35

      CyclicBarrier 和之前CountDownLatch(闭锁)功能上面差不多,都阻塞一组线程直到某个事件发生 。主要我们来看一下它们的区别:

    1 . CountDownLatch 是等待事件的发生,而CyclicBarrier则是等待线程的到来,然后执行某个操作,

    2.  CyclicBarrier可以重复使用,也就是大家可以反复的在栅栏处汇集,而 CountDownLatch只能一次使用。

    3.  如果等待的都是线程的话,CountDownLatch并不会阻塞等待的线程,只是阻塞将要发生的线程,CyclicBarrier 是会阻塞等待的线程,当所有的线程到达之后又会唤醒阻塞的线程。

  下面我们看一下具体的使用:

  

package javaThread;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;public class CyclicBarrierThread {    public static void main(String[] args) {        CyclicBarrier cyclicBarrier = new CyclicBarrier(7, new Runnable() {                        @Override            public void run() {                System.out.println(" wating for runt , start to run");              }        });        for(int i  = 0;i< 7 ;i ++) {            Worker work = new Worker("name " +i , cyclicBarrier);            new Thread(work).start();        }    }        static class Worker implements Runnable {          final String id;          final CyclicBarrier barrier;                public Worker(final String id, final CyclicBarrier barrier) {              this.id = id;              this.barrier = barrier;          }                @Override          public void run() {              try {                  System.out.println(id + "starts to run !");                  Thread.sleep((long) (Math.random() * 10000));                  System.out.println(id + "arrived !");                  barrier.await();                  System.out.println(id + "starts to run end  !");              } catch (InterruptedException e) {                  e.printStackTrace();              } catch (BrokenBarrierException e) {                  e.printStackTrace();              }          }      }  }

CyclicBarrier创建了一个所有线程到达之后执行的Runable ,当所以者到达后执行Runable

0 0
原创粉丝点击