CyclicBarrier允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待。
package com.skydream.thread.cyclicBarrier;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Runnable1 implements Runnable {
private CyclicBarrier cyclicBarrier;
public Runnable1(CyclicBarrier cyclicBarrier)
{
this.cyclicBarrier = cyclicBarrier;
}
@Override
public void run() {
System.out.println("this is Runnable1");
try {
cyclicBarrier.await();
System.out.println("================");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
package com.skydream.thread.cyclicBarrier;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CyclicBarrierTest {
/**
* @param args
*/
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
service.execute(new Runnable1(cyclicBarrier));
for(int i=0;i<4;i++)
{
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
Thread.sleep((long)(Math.random()*10000));
System.out.println("这是在Runnable里");
cyclicBarrier.await();
System.out.println("runable await 之后");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
service.execute(runnable);
}
}
}
从运行结果可以看出三个线程到达后才继续往下运行。