CyclicBarrier允许给定数量的线程全部到达关卡点时,关卡就被成功突破,关卡被重置以备下一次使用。跟CountDownlatch特别类似,但是CountDownLatch不同的是不能被重新重置再使用。
前面的blog说到用countdownlatch去完成方法里面的3个service的调用。用cyclicBarrier同样可以实现。
package cyclicbarrier;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
*
*<p>Test</p>
*<p>Description:</P>
*<p>Company:</p>
*<p>Department:CAS</p>
*@Author: Tommy Zhou
*@Since: 1.0
*@Version:Date:2011-4-26
*
**/
public class CyclicBarrierSample {
public static void main(String[] args) {
String[] strs = getResult();
for (int i = 0; i < strs.length; i++) {
System.out.println(strs[i]);
}
}
public static String[] getResult(){
String[] strs = new String[3];
CyclicBarrier cyclicBarrier = new CyclicBarrier(4);
Work1 work1 = new Work1(cyclicBarrier,strs[0]);
Work2 work2 = new Work2(cyclicBarrier,strs[1]);
Work3 work3 = new Work3(cyclicBarrier,strs[2]);
work1.start();
work2.start();
work3.start();
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
strs[0] = work1.str1;
strs[1] = work2.str2;
strs[2] = work3.str3;
return strs;
}
}
class Work1 extends Thread{
public String str1;
public CyclicBarrier cyclicBarrier1;
public Work1(CyclicBarrier cyclicBarrier1,String str1){
this.cyclicBarrier1 = cyclicBarrier1;
this.str1 = str1;
}
public void run(){
str1="work1";
try {
cyclicBarrier1.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Work2 extends Thread{
public String str2;
public CyclicBarrier cyclicBarrier2;
public Work2(CyclicBarrier cyclicBarrier2,String str2){
this.cyclicBarrier2 = cyclicBarrier2;
this.str2 = str2;
}
public void run(){
try {
Thread.sleep(3000);
str2="work2";
cyclicBarrier2.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
class Work3 extends Thread{
public String str3;
public CyclicBarrier cyclicBarrier3;
public Work3(CyclicBarrier cyclicBarrier3,String str3){
this.cyclicBarrier3 = cyclicBarrier3;
this.str3 = str3;
}
public void run(){
try {
Thread.sleep(3000);
str3="work3";
cyclicBarrier3.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}