新Java并发线程控制:CyclicBarrier等待所有线程到达一个状态后再让全部线程处于一个起跑线(1)

版权声明:本文为Zhang Phil原创文章,请不要转载! https://blog.csdn.net/zhangphil/article/details/83501322

新Java并发线程控制:CyclicBarrier等待所有线程到达一个状态后再让全部线程处于一个起跑线(1)

Java批量线程运行后,有的运行慢,有的运行快,CyclicBarrier让所有线程到达一定状态后继续接着执行。举一个龟兔赛跑的例子,兔子很快就可以到400米赛点,而乌龟跑的慢,很慢才到。现在要求兔子和乌龟必须都到达400米赛点时候才可以重启赛跑。CyclicBarrier的await()方法,使得跑的快的兔子在到达400米赛点后停止,等到所有乌龟到齐后,继续跑。
例如代码:

    private void test() {
        int parties = 3;

        CyclicBarrier cyclicBarrier = new CyclicBarrier(parties);
        for (int i = 0; i < parties; i++) {
            new WorkThread(cyclicBarrier).start();
        }
    }

    private class WorkThread extends Thread {
        private CyclicBarrier cyclicBarrier;

        public WorkThread(CyclicBarrier cyclicBarrier) {
            this.cyclicBarrier = cyclicBarrier;
        }

        @Override
        public void run() {
            try {
                System.out.println("线程" + Thread.currentThread().getId() + "开始...");
                Thread.sleep(2000);
                System.out.println("线程" + Thread.currentThread().getId() + "结束");

                System.out.println("线程" + Thread.currentThread().getId() + "等待...");
                cyclicBarrier.await();

                System.out.println("线程" + Thread.currentThread().getId() + "解锁,go !");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

输出:

2018-10-29 09:41:27.111 2349-2381/zhangphil.test I/System.out: 线程49969开始...
2018-10-29 09:41:27.112 2349-2380/zhangphil.test I/System.out: 线程49968开始...
2018-10-29 09:41:27.116 2349-2382/zhangphil.test I/System.out: 线程49970开始...
2018-10-29 09:41:29.113 2349-2381/zhangphil.test I/System.out: 线程49969结束
2018-10-29 09:41:29.113 2349-2380/zhangphil.test I/System.out: 线程49968结束
2018-10-29 09:41:29.113 2349-2380/zhangphil.test I/System.out: 线程49968等待...
2018-10-29 09:41:29.114 2349-2381/zhangphil.test I/System.out: 线程49969等待...
2018-10-29 09:41:29.116 2349-2382/zhangphil.test I/System.out: 线程49970结束
2018-10-29 09:41:29.116 2349-2382/zhangphil.test I/System.out: 线程49970等待...
2018-10-29 09:41:29.117 2349-2382/zhangphil.test I/System.out: 线程49970解锁,go !
2018-10-29 09:41:29.117 2349-2380/zhangphil.test I/System.out: 线程49968解锁,go !
2018-10-29 09:41:29.117 2349-2381/zhangphil.test I/System.out: 线程49969解锁,go !

在这里,注意CyclicBarrier和CountDownLatch的细微异同,CyclicBarrier和CountDownLatch初看似乎功能有些一致的地方,CountDownLatch是等待所有线程全部执行完毕,CyclicBarrier是让某些线程等待其他线程运行到一定阶段。仍以龟兔赛跑为例。CountDownLatch更像是为清洁赛道的保洁工人准备的,保洁工人需要CountDownLatch帮他们了解是否全部运动员已经都结束比赛,然后保洁工人方便进场开始打扫卫生。而CyclicBarrier则是作用赛跑中的运动员的,让乌龟和兔子均到达400米跑道后重新使得他们处于一个起跑线。


附录:
1,《新Java线程Semaphore:并行环境下访问竞争资源控制》
https://blog.csdn.net/zhangphil/article/details/83410270 

2,《新Java并发线程控制:CountDownLatch等待所有线程运行完毕才执行》
https://blog.csdn.net/zhangphil/article/details/83443995 

猜你喜欢

转载自blog.csdn.net/zhangphil/article/details/83501322