什麼是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