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

此条目发表在java/j2ee分类目录,贴了, 标签。将固定链接加入收藏夹。

发表评论

您的电子邮箱地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据