0
点赞
收藏
分享

微信扫一扫

CyclicBarrier线程栅栏的作用

墨春 2021-09-30 阅读 82

直观形象的理解

若干个线程分别执行各自的业务逻辑,需要一个类似checkpoint的节点,让每个线程执行到这个节点时都等一下,等所有的线程都执行到了这个节点之后,再各自往下执行自己的逻辑。
Barrier中途拦截了各个线程的执行流,就好像一个栅栏在路上拦住了各个车子(线程),等所有的车子都到达之后,再统一让各个车子通过栅栏继续跑。

程序

public class CyclicBarrierTest {
    
    public static void main(String[] args) {
        int N = 5;
        CyclicBarrier cyclicBarrier = new CyclicBarrier(N); //这个是能协调N个线程的CyclicBarrier
        for(int i=0; i<N; i++) {
            new ServiceThread(cyclicBarrier).start();
        }
    }
    
    static class ServiceThread extends Thread {
        private Logger logger = LoggerFactory.getLogger(ServiceThread.class);
        private CyclicBarrier barrier;
        
        public ServiceThread(CyclicBarrier barrier) {
            this.barrier = barrier;
        }
        
        @Override
        public void run() {
            Random r = new Random();
            int sleepTime = r.nextInt(5);
            sleepTime++;
            try {
                TimeUnit.SECONDS.sleep(sleepTime); //随机sleep1到5秒,模拟执行了前置业务逻辑
                logger.info("线程"+Thread.currentThread().getName()+"执行业务逻辑完毕,等待其他线程也执行完业务逻辑。");
                this.barrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
            logger.info("所有的线程都执行完前置业务逻辑了,线程"+Thread.currentThread().getName()+"继续执行自己接下来的业务逻辑。");
        }
    }

}

运行结果:

线程Thread-2执行业务逻辑完毕,等待其他线程也执行完业务逻辑。
线程Thread-3执行业务逻辑完毕,等待其他线程也执行完业务逻辑。
线程Thread-0执行业务逻辑完毕,等待其他线程也执行完业务逻辑。
线程Thread-5执行业务逻辑完毕,等待其他线程也执行完业务逻辑。
线程Thread-4执行业务逻辑完毕,等待其他线程也执行完业务逻辑。
所有的线程都执行完前置业务逻辑了,线程Thread-4继续执行自己接下来的业务逻辑。
所有的线程都执行完前置业务逻辑了,线程Thread-2继续执行自己接下来的业务逻辑。
所有的线程都执行完前置业务逻辑了,线程Thread-0继续执行自己接下来的业务逻辑。
所有的线程都执行完前置业务逻辑了,线程Thread-3继续执行自己接下来的业务逻辑。
所有的线程都执行完前置业务逻辑了,线程Thread-5继续执行自己接下来的业务逻辑。
举报

相关推荐

0 条评论