博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java高级---->Thread之CyclicBarrier的使用
阅读量:5317 次
发布时间:2019-06-14

本文共 2324 字,大约阅读时间需要 7 分钟。

  CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。今天我们就学习一下CyclicBarrier的用法。

 

CyclicBarrier的简单使用

  类CyclicBarrier不仅有CountDownLatch所具有的功能,还可以实现屏障等待的功能,也就是阶段性同步,它在使用上的意义在于可以循环地实现线程要一起做任务的目标,而不是像类CountDownLatch一样,仅仅支持一次线程与同步点阻塞的特性。

关于CyclicBarrier常用的方法的介绍:

package com.linux.huhx.concurreny;import java.io.IOException;import java.util.Random;import java.util.concurrent.BrokenBarrierException;import java.util.concurrent.CyclicBarrier;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class CyclicBarrierTest1 {    public static void main(String[] args) throws IOException, InterruptedException {        /**         * 1、如果参数>3的话,三个线程的await执行完,parties只能加到3。那么子线程await后续的方法就不能执行         * 2、如果参数=3的话,三个线程的await执行完,parties能加到3。所以子线程await后续的方法能执行         * 3、如果参数<3的话,当第二个线程await执行完之后,parties加到了2。??????         */        CyclicBarrier barrier = new CyclicBarrier(3);        ExecutorService executor = Executors.newFixedThreadPool(3);        executor.submit(new Thread(new Runner(barrier, "1号选手")));        executor.submit(new Thread(new Runner(barrier, "2号选手")));        executor.submit(new Thread(new Runner(barrier, "3号选手")));        Thread.sleep(200);        System.out.println("in main method after");        executor.shutdown();    }    public static class Runner implements Runnable {        // 一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)        private CyclicBarrier barrier;        private String name;        public Runner(CyclicBarrier barrier, String name) {            super();            this.barrier = barrier;            this.name = name;        }        @Override        public void run() {            try {                Thread.sleep(new Random().nextInt(1000));                System.out.println(name + " 准备好了...");                // barrier的await方法,在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。                barrier.await();            } catch (InterruptedException e) {                e.printStackTrace();            } catch (BrokenBarrierException e) {                e.printStackTrace();            }            System.out.println(name + " 起跑!");        }    }}

运行的结果如下:执行的结果不固定

in main method after2号选手 准备好了...1号选手 准备好了...3号选手 准备好了...2号选手 起跑!1号选手 起跑!3号选手 起跑!

 

友情链接

  • 比较好的参考博客:

 

转载于:https://www.cnblogs.com/huhx/p/baseusejavaCyclicBarrier.html

你可能感兴趣的文章
标识符
查看>>
给大家分享一张CSS选择器优选级图谱 !
查看>>
Node.js 入门:Express + Mongoose 基础使用
查看>>
一步步教你轻松学奇异值分解SVD降维算法
查看>>
objective-c overview(二)
查看>>
python查询mangodb
查看>>
驱动的本质
查看>>
Swift的高级分享 - Swift中的逻辑控制器
查看>>
Python数据分析入门案例
查看>>
vue-devtools 获取到 vuex store 和 Vue 实例的?
查看>>
内存地址对齐
查看>>
创新课程管理系统数据库设计心得
查看>>
Could not resolve view with name '***' in servlet with name 'dispatcher'
查看>>
pandas 修改指定列中所有内容
查看>>
lua语言入门之Sublime Text设置lua的Build System
查看>>
vue.js基础
查看>>
电脑的自带图标的显示
查看>>
[转载] redis 的两种持久化方式及原理
查看>>
C++ 删除字符串的两种实现方式
查看>>
ORA-01502: 索引'P_ABCD.PK_WEB_BASE'或这类索引的分区处于不可用状态
查看>>