什么是CyclicBarrier
CyclicBarrier是JDK 5中java.util.Concurrent包中提出的同步类。CyclicBarrier可以用来等待子任务都完成后执行最后的任务。所有的线程等待其它线程到达Barrier。CyclicBarrier初始化时指定需要等待的线程数,通过调用CyclicBarrier.await()方法,所有线程阻塞等待直到都调用了await()方法。
Java中CyclicBarrier使用例子
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest{
private static class Task implements Runnable{
private CyclicBarrier barrier;
public Task(CyclicBarrier barrier){
this.barrier = barrier;
}
@Override
public void run(){
try {
System.out.println(Thread.currentThread().getName() + " is waiting on barrier");
barrier.await();
System.out.println(Thread.currentThread().getName() + " has crossed the barrier");
} catch (Exception ex){
}
}
}
public static void main(String[] args) {
// creating CyclicBarrier with 3 parties i.e. 3 Threads needs to call await()
final CyclicBarrier cb = new CyclicBarrier(3, new Runnable(){
public void run(){
// This task will be executed once all thread reaches barrier
System.out.println("All parties are arrived at barrier, lets play");
}
});
//starting each of thread
Thread t1 = new Thread(new Task(cb), "Thread 1");
Thread t2 = new Thread(new Task(cb), "Thread 2");
Thread t3 = new Thread(new Task(cb), "Thread 3");
t1.start();
t2.start();
t3.start();
}
}
output:
Thread 1 is waiting on barrier
Thread 3 is waiting on barrier
Thread 2 is waiting on barrier
All parties are arrived at barrier, lets play
Thread 2 has crossed the barrier
Thread 3 has crossed the barrier
Thread 1 has crossed the barrier
什么时候使用CyclicBarrier
考虑到CyclicBarrier的特性可以用来实现mapreduce任务,例如多玩家游戏等待所有玩家都加入后才开始游戏。
CyclicBarrier重要知识点
1.CyclicBarrier可以用于所有线程到达barrier后执行任务
2.如果CyclicBarrier初始化了3个线程,这3个线程需要调用await()方法来消除barrier
3.线程将会阻塞在await()方法直到所有线程到达barrier
参考:
1.http://javarevisited.blogspot.hk/2012/07/cyclicbarrier-example-java-5-concurrency-tutorial.html