CyclicBarrier 重用示例

LMK*_*LMK 5 java concurrency multithreading

在这种情况下,CyclicBarrier 是否最合适。我想在 Stages 中并行运行 n 个线程(在 Stages 等待直到所有线程完成该 Stage)。

        public class CyclicBarr {


        public static void main(String[] args) {


            CyclicBarrier barrier = new CyclicBarrier(3, new Runnable() {
                private int count =1;
                @Override
                public void run() {
                    System.out.println("Completed..!! "+(count++));
                }
            });

            for (int i = 1; i <= 3; i++) {

                Thread t = new Thread(new CuclicBarThread(barrier));
                t.start();

            }



        }
    }
Run Code Online (Sandbox Code Playgroud)

线程是

        public class CuclicBarThread implements Runnable {

        CyclicBarrier barrier;

        public CuclicBarThread(CyclicBarrier barrier) {
            this.barrier = barrier;
        }

        @Override
        public void run() {
            try {
                for (int i = 1; i < 5; i++) {
                    Thread.sleep(100);
                }
                System.out.println(Thread.currentThread().getName() + " :: Waiting At Barrier 1 After Stage 1 Completed");
                barrier.await();

                for (int i = 1; i < 5; i++) {
                    Thread.sleep(1000);
                }
                System.out.println(Thread.currentThread().getName() + " :: Waiting At Barrier 2 After Stage 2 Completed");
                barrier.await();

                for (int i = 1; i < 5; i++) {
                    Thread.sleep(100);
                }
                System.out.println(Thread.currentThread().getName() + " :: Waiting At Barrier 3 After Stage 3 Completed");
                barrier.await();
                System.out.println(Thread.currentThread().getName()+" :: $$$$$$$$ Completed $$$$$$$$");
            } catch (Exception ex) {
                ex.printStackTrace();
            }



        }
    }
Run Code Online (Sandbox Code Playgroud)

Den*_*kov 2

是的,它是可重复使用的。这就是为什么它被称为“循环”。以下是其JavaDoc的引用:

一种同步辅助工具,允许一组线程全部等待彼此到达公共障碍点。CyclicBarriers 在涉及固定大小的线程组且偶尔必须相互等待的程序中非常有用。屏障被称为循环屏障,因为它可以在等待线程被释放后被重新使用。

你对 CyclicBarrier 的使用对我来说似乎很好。