CyclicBarrier 和之前CountDownLatch(闭锁)功能上面差不多,都阻塞一组线程直到某个事件发生 。主要我们来看一下它们的区别:
1 . CountDownLatch 是等待事件的发生,而CyclicBarrier则是等待线程的到来,然后执行某个操作,
2. CyclicBarrier可以重复使用,也就是大家可以反复的在栅栏处汇集,而 CountDownLatch只能一次使用。
3. 如果等待的都是线程的话,CountDownLatch并不会阻塞等待的线程,只是阻塞将要发生的线程,CyclicBarrier 是会阻塞等待的线程,当所有的线程到达之后又会唤醒阻塞的线程。
下面我们看一下具体的使用:
package javaThread;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierThread {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(7, new Runnable() {
@Override
public void run() {
System.out.println(" wating for runt , start to run");
}
});
for(int i = 0;i< 7 ;i ++) {
Worker work = new Worker("name " +i , cyclicBarrier);
new Thread(work).start();
}
}
static class Worker implements Runnable {
final String id;
final CyclicBarrier barrier;
public Worker(final String id, final CyclicBarrier barrier) {
this.id = id;
this.barrier = barrier;
}
@Override
public void run() {
try {
System.out.println(id + "starts to run !");
Thread.sleep((long) (Math.random() * 10000));
System.out.println(id + "arrived !");
barrier.await();
System.out.println(id + "starts to run end !");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
CyclicBarrier创建了一个所有线程到达之后执行的Runable ,当所以者到达后执行Runable