CyclicBarrier,通过设置屏障的方式使得多线程同步,能够控制多个线程在屏障处等等其他线程也执行到屏障点,可以实现CountDownLatch具有的功能,但是比CountDownLatch功能强大;
CyclicBarrier即同步屏障,它主要功能是让一组线程达到一个屏障(也可以称为同步点)是被阻塞,直到最后一个线程达到屏障时,屏障才被打开,所有被拦截的线程才会继续执行。
其构造函数默认也是接收一个int类型的参数N作为屏障拦截的线程数量,每个线程调用await方法表示到达了屏障点,然后被阻塞。
具体示例如下:
public class CyclicBarrierTest { // 参数表示屏障拦截的线程数量, 每个线程调用 await方法,告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞 // 屏障拦截的线程数量必须和当前的线程数一致,并且都调用await方法,否则当前所有的线程都处于等待状态 static CyclicBarrier c = new CyclicBarrier(3); public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { try { System.out.println("1---1 " + new SimpleDateFormat("HH:mm:ss").format(new Date())); c.await(); } catch (BrokenBarrierException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("1---2 " + new SimpleDateFormat("HH:mm:ss").format(new Date())); } }).start(); new Thread(new Runnable() { @Override public void run() { System.out.println("2---1 " + new SimpleDateFormat("HH:mm:ss").format(new Date())); try { c.await(); } catch (BrokenBarrierException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("2---2 " + new SimpleDateFormat("HH:mm:ss").format(new Date())); } }).start(); SleepUtils.second(2); System.out.println("3---1 " + new SimpleDateFormat("HH:mm:ss").format(new Date())); try { c.await(); } catch (BrokenBarrierException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("3---2 " + new SimpleDateFormat("HH:mm:ss").format(new Date())); } }
输出结果如下:
2---1 10:03:30 1---1 10:03:30 3---1 10:03:32 1---2 10:03:32 2---2 10:03:32 3---2 10:03:32
注意点
1、构造函数中的N必须为线程的总数,当最后一个线程调用await方法(到达屏障)时,屏障才会打开,被阻塞的线程才会执行,这里的N表示的含义和CountDownLatch传入的N是不一样的。
2、我们发现,当所有线程都到达屏障时,当屏障打开,接下来会优先执行哪个线程呢?如上代码答案是不确定的。但是CyclicBarrier为我们提供了一个更高级的用法,即构造函数还支持传递一个Runnable对象,当屏障打开时,优先执行Runnable中的run方法。(这一功能十分强大,完全可以替代CountDownLatch了)
应用场景
同CountDownLatch
与CountDownLatch区别:
CountDownLatch计数器只能使用一次,而CyclicBarrier的计数器可以使用 reset方法重置,所以适合更复杂的业务场景。
参考: https://blog.csdn.net/qq_27828675/article/details/114068266
作者:Work Hard Work Smart
出处:http://www.cnblogs.com/linlf03/
欢迎任何形式的转载,未经作者同意,请保留此段声明!