blog » Java/J2EE » CyclicBarrier类使用总结

CyclicBarrier类使用总结

事实上,看到这个类名的时候我是一头雾水,因为组成这个类的两个单词cyclic和barrier我都不认识。于是打开有道词典查了一下:

cyclic:循环的;周期的;
barrier:障碍物;

拼到一起就是“循环障碍物”,呃,不明觉厉的一个词啊。

上网查了一下,发现该类就是用来阻塞一组线程以达到并发执行效果的一个工具。

官方解释如下:

一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。

CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。

来源:http://www.cjsdn.net/doc/jdk50/java/util/concurrent/CyclicBarrier.html

以下是一个示例:

申请了1000个线程,并且执行1000次任务。当所有任务完成后,main退出。

public class Test {
     public static void main(String[] args) {
          int count = 1000;
          CyclicBarrier cyclicBarrier = new CyclicBarrier(count);
          ExecutorService executorService = Executors.newFixedThreadPool(count);
          for (int i = 0; i < count; i++)
               executorService.execute(new Test().new Task(cyclicBarrier));

          executorService.shutdown();
          while (!executorService.isTerminated()) {
               try {
                    Thread.sleep(10);
               } catch (InterruptedException e) {
                    e.printStackTrace();
               }
          }
     }

     public class Task implements Runnable {
          private CyclicBarrier cyclicBarrier;

          public Task(CyclicBarrier cyclicBarrier) {
               this.cyclicBarrier = cyclicBarrier;
          }

          @Override
          public void run() {
               try {
                    // 等待所有任务准备就绪
                    cyclicBarrier.await();
                    // 测试内容
               } catch (Exception e) {
                    e.printStackTrace();
               }
          }
     }
}

例子来源:http://www.iteye.com/topic/1116314

This post has already been read 967 times!

Related posts

RSS 2.0 | leave a response | trackback

发表评论