让一组线程达到一个同步点时被阻塞,直到最后一个线程达到同步点,这时候屏障才会放行,所有被屏障拦截的线程才会继续执行。
构造方法:
public CyclicBarrier(intparties) {
this(parties,null);
}
public CyclicBarrier(intparties,Runnable r) {
this(parties,null);
}
构造参数表示屏障拦截的线程数,每一个线程调用await方法告诉屏障,他已经到达屏障,然后技术器减一,直到计数器为0.当前线程被阻塞。如果构造的线程多于执行的线程,即到达屏障的线程数 < parties,那么屏障会一直等,所有到达的线程都不会继续执行,一直处于阻塞状态。
如果构造参数包括一个Runnable, 那么这个线程会优先执行。
publicclassCyclicBarrierClient {
private static CyclicBarrier barrier =new CyclicBarrier(2, new Worker());
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
try {
barrier.await();
}catch (Exception e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
System.out.println("nicky");
System.out.println("belly");
}
},"Thread1").start();
try {
barrier.await();
}catch (Exception e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
System.out.println("last");
}
static class Worker implements Runnable{
@Override
public void run() {
System.out.println("first");
}
}
}
首先优先执行Worker,然后在都达到屏障时,执行线程1和主线程的东西,注意,并不一定线程一先执行,有可能主线程先执行。因为主线程并不会说等线程1执行完了在执行。
CountDownLatch 和 CyclicBarrier 比较:
CountDownLatch:其计数器只能使用一次
CyclicBarrier: 其技术器可以通过reset重复使用