java 多线程 CyclicBarrier

CyclicBarrier 循环栅栏 ,主要方法如下:

new CyclicBarrier(num);//设置栅栏数

new CyclicBarrier(num,Runnable)//设置栅栏数(目标数),并且达到目标后做的事情

cyclicBarrier.await();//到达栅栏,让线程等待,等到有足够多到达栅栏的任务才会继续往下走。栅栏是循环的。

示例:


    public static void test2(){
        /**
         * 设置 10 个目标数,目标完成后需要做的事情,这个会循环去做
         */
        CyclicBarrier cyclicBarrier = new CyclicBarrier(3,()->{
            System.out.println("终于完成任务了");
        });//目标数
        for (int j=0;j<5;j++) {
            new Thread(()->{
                for(int i=0;i<3;i++){
                    try {
                        Thread.sleep(1000);
                        System.out.println("尝试获取 :"+i);
                        cyclicBarrier.await();//大家一起达到这个目标,才继续往下执行
                        System.out.println("获取成功 :"+i);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }

运行结果:

尝试获取 :0
尝试获取 :0
尝试获取 :0
尝试获取 :0
尝试获取 :0
终于完成任务了
获取成功 :0
获取成功 :0
获取成功 :0
尝试获取 :1
终于完成任务了
获取成功 :1

。。。

结果说明:

上诉程序声明的栅栏数为3,所以调用 3个 cyclicBarrier.await() 就可以执行

1:cyclicBarrier 声明时的Runnable线程,也就是打印 “终于完成任务了”

2:cyclicBarrier.await() 阻断后的程序 也就是 “获取成功”

所以上诉第6个“尝试获取”后,会有连续3个“获取成功”

发布了60 篇原创文章 · 获赞 6 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xiaoluo5238/article/details/104382801