屏障CyclicBarrier

时间 2019/6/20 13:11:13 加载中...

CyclicBarrier 循环屏障,循环栅栏

那么如何理解呢?

循环栅栏指的是当一个线程到达栅栏时,停止运行,并等待其它线程的到来,当线程数达到一定数量时,这几个线程再继续运行。

示意图:

示例讲解

更通俗一点的理解呢

相当于有一个饭店,你们够5个人才能吃饭,不够5个人,那就等够了5个人。
这里的人指的就是线程,饭店相当于CyclicBarrier。

这里写一个Demo

有一个 Person 类的线程

  1. import java.util.concurrent.BrokenBarrierException;
  2. import java.util.concurrent.CyclicBarrier;
  3. public class Person implements Runnable {
  4. private CyclicBarrier cyclicBarrier;
  5. private int num;
  6. public Person(CyclicBarrier cyclicBarrier,int num){
  7. this.cyclicBarrier = cyclicBarrier;
  8. this.num = num;
  9. }
  10. @Override
  11. public void run() {
  12. try {
  13. //做一些事
  14. System.out.println(num + "做一些事");
  15. Thread.sleep(1000*2);
  16. //事情做完,相当于到了栅栏处,等待其它线程做完。
  17. cyclicBarrier.await();
  18. Thread.sleep(1000*2);
  19. System.out.println(num + "做完了");
  20. } catch (InterruptedException e) {
  21. e.printStackTrace();
  22. } catch (BrokenBarrierException e) {
  23. e.printStackTrace();
  24. }
  25. }
  26. }

我们构造一个 CyclicBarrier,指定当有3个线程时,CyclicBarrier就可以做一些事情,然后到达的3个线程就可以继续运行。

  1. import java.util.concurrent.CyclicBarrier;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4. public class PersonOperator {
  5. public static void main(String[] args) {
  6. CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new Runnable() {
  7. @Override
  8. public void run() {
  9. System.out.println("over once");
  10. }
  11. });
  12. ExecutorService executorService = Executors.newCachedThreadPool();
  13. for(int i=0; i<6; i++){
  14. executorService.execute(new Person(cyclicBarrier,i));
  15. }
  16. executorService.shutdown();
  17. }
  18. }

输出结果

  1. 0做一些事
  2. 1做一些事
  3. 2做一些事
  4. 3做一些事
  5. 4做一些事
  6. 5做一些事
  7. over once
  8. over once
  9. 2做完了
  10. 4做完了
  11. 3做完了
  12. 1做完了
  13. 0做完了
  14. 5做完了
扫码分享
版权说明
作者:SQBER
文章来源:http://www.sqber.com/articles/CyclicBarrier.html
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。