在java的线程同步器中有一个类叫做CyclicBarrier,使用这个类可以使多个线程在全部达到某种条件的情况下才能执行接下的任务。举个例子来说,田径比赛上,发令员必须等到所有的选手都准备好了之后才开枪,在任何一个运动员准备好之前,其他的运动员都是不可以抢跑的,必须等到所有的运动达到了准备状态才可以。
package com.app.async;
import java.util.concurrent.*;
/**
* Created by joe.wang on 2016/7/21.
*/
public class CyclicBarrierMotion {
public static void main(String[] args) {
CyclicBarrier barrier = new CyclicBarrier(3);
ExecutorService service = Executors.newCachedThreadPool();
service.submit(new RunnningMan(barrier, "zhangsan"));
service.submit(new RunnningMan(barrier, "lisi"));
service.submit(new RunnningMan(barrier,"wangwu"));
service.shutdown();
}
}
class RunnningMan implements Runnable {
private CyclicBarrier mCyclicBarrier;
private String tagName;
public RunnningMan(CyclicBarrier barrier, String name) {
this.mCyclicBarrier = barrier;
tagName = name;
}
@Override
public void run() {
try {
Thread.sleep(1000 * (int)(Math.random() * 10));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(tagName + " 准备好了!");
try {
mCyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println(tagName + "开始run!!");
}
}
可以理解为调用了await()方法表示该线程已经准备好了,正在等待其他线程;当最后一个线程调用awit()方法时,所有的线程阻塞被解除。