CyclicBarrier工具的作用:
控制线程池中的所有线程全执行到某一个集合点时(即某一行代码)时,所有线程才能继续执行一集合点后面的代码,并前往下一个集合点,哪怕有1个线程还未到,那么其它线程将等待这个线程到达指定集合点。这就好比我们跟团去旅游,只有大家全部到达了指定地点,我们的大巴车才能出发。当我们到达了景区下车自由活动后,所有人员又必须得到第二个指定集合点,我们的大巴才能回家。依次类推,也可以有第3,第4...个集合点。
示例代
package testFuture;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CyclicBarrierTest {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final CyclicBarrier cb = new CyclicBarrier(3);
for(int i=0;i<3;i++){
Runnable runnable = new Runnable(){
public void run(){
try {
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() +
"即将到达集合地点1,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
cb.await(); //在集合点等待其它线程也执行到这里,然后才能往下执行。
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() +
"即将到达集合地点2,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
cb.await(); //在集合点等待其它线程也执行到这里,然后才能往下执行。
Thread.sleep((long)(Math.random()*10000));
System.out.println("线程" + Thread.currentThread().getName() +
"即将到达集合地点3,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
cb.await(); //在集合点等待其它线程也执行到这里,然后才能往下执行。
} catch (Exception e) {
e.printStackTrace();
}
}
};
service.execute(runnable);
}
service.shutdown();
}
}
码如下: