CyclicBarrier与CountDownLatch类似,一般用于任务拆分,例如一个任务分派多个子任务,然后组任务需要等待所有子任务执行结束后合并子任务返回的结果。具体请参照实例:
package nc.com.thread.other;
import java.util.Random;
import java.util.concurrent.CyclicBarrier;
/**
* 一般在应用任务拆分时使用,先拆分再合并子任务结果的处理
* @ClassName: CyclicBarrierTest
* @Description: TODO(这里用一句话描述这个类的作用)
* @author A18ccms a18ccms_gmail_com
* @date 2015-12-20 下午05:30:38
*
*/
public class CyclicBarrierTest {
private static boolean finished=false;
public static void main(String[] args) {
CyclicBarrier readybarr = new CyclicBarrier(3,new recorder());
for(int i=0;i<3;i++){
new Thread(new Runner(readybarr), "运动员"+i).start();
}
}
static class Runner implements Runnable{
CyclicBarrier readybarr;
public Runner(CyclicBarrier readybarr){
this.readybarr=readybarr;
}
@Override
public void run() {
try {
Thread.sleep(1000 * (new Random()).nextInt(8));
System.out.println(""+Thread.currentThread().getName()+"已经在起跑线做好了准备......");
readybarr.await();
System.out.println(""+Thread.currentThread().getName()+"开始跑");
Thread.sleep(1000 * (new Random()).nextInt(8));
System.out.println(""+Thread.currentThread().getName()+"到达终点");
finished =true;
readybarr.await();
} catch (Exception e) {
e.printStackTrace();
}
}
}
static class recorder implements Runnable{
@Override
public void run() {
if(finished){
System.out.println("比赛结束,技术台公布成绩");
finished =false;
}
}
}
}