事实上,看到这个类名的时候我是一头雾水,因为组成这个类的两个单词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
Sorry, the comment form is closed at this time.
No comments yet.