当前位置: 首页 > article >正文

CyclicBarrier复杂场景示例

        比如这样一个场景,公司组织10名员工去旅游,先组织大家吃饭,吃完饭在一起坐车去景点。

要求:吃饭:必须10名员工都到座位了才能一起吃饭

           坐车:必须10名员工都上车了,才能发车。

一、代码如下

package com.lsl.utills;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.TimeUnit;

/**
 * CyclicBarrier复杂场景示例
 * 公司组织10名员工去旅游,包括吃饭和上车去景点游玩
 * 吃饭要求10个员工都到座才能开始一起吃饭
 * 坐车要求10个员工到上车,才能发车
 */
public class CyclicBarrierDemo03 {
    public static CyclicBarrier cyclicBarrier = new CyclicBarrier(10);

    public static class CyclicBarrierTask extends Thread {
        int sleep;

        public CyclicBarrierTask(String name, int sleep) {
            super(name);
            this.sleep = sleep;
        }

        //等待吃饭
        void eat() {
            try {
                //模拟休眠
                TimeUnit.SECONDS.sleep(sleep);
                long starTime = System.currentTimeMillis();
                System.out.println(this.getName() + "到了,开始等待其他员工到座");
                //调用await()的时候,当前线程将会被阻塞,需要等待其他员工都到达await了才能继续
                cyclicBarrier.await();

                long endTime = System.currentTimeMillis();

                //休眠sleep时间,模拟当前员工吃饭耗时
                TimeUnit.SECONDS.sleep(sleep);

                System.err.println(this.getName() + ",sleep:" + this.sleep + " 等待了" + (endTime - starTime) + "(ms),开始吃饭了!");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }

        //等待所有人到齐之后,开车去下一站
        void drive() {
            try {
                long starTime = System.currentTimeMillis();
                //调用await()的时候,当前线程将会被阻塞,需要等待其他员工都到达await了才能继续
                cyclicBarrier.await();
                long endTime = System.currentTimeMillis();
                System.out.println(this.getName() + ",sleep:" + this.sleep + " 等待了" + (endTime - starTime) + "(ms),去下一景点的路上!");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void run() {
            //等待所有人到齐之后吃饭,先到的人坐那等着,什么事情不要干
            this.eat();
            //等待所有人到齐之后开车去下一景点,先到的人坐那等着,什么事情不要干
            this.drive();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        for (int i = 1; i <= 10; i++) {
            new CyclicBarrierTask("员工" + i, i).start();
        }
    }
}

二、运行截图

三、总结

        代码中CyclicBarrier相当于使用了2次,第一次用于等待所有人到达后开饭,第二次用于等待所有人上车后驱车去下一景点。

        CyclicBarrier内部相当于有个计数器(构造方法传入的),每次调用await();后,计数器会减1,并且await()方法会让当前线程阻塞,等待计数器减为0的时候,所有在await()上等待的线程被唤醒,然后继续向下执行,此时计数器又会被还原为创建时的值,然后可以继续再次使用


http://www.kler.cn/a/393444.html

相关文章:

  • 解决:excel鼠标滚动幅度太大如何调节?
  • 01.HTTPS的实现原理-HTTPS的概念
  • Java中以某字符串开头且忽略大小写字母如何实现【正则表达式(Regex)】
  • dockerfile文档编写(1):基础命令
  • 【ES6复习笔记】Class类(15)
  • PVE虚拟化平台之开启虚拟机IP显示方法
  • ThinkServer SR658H V2服务器BMC做raid与装系统
  • TCP 为什么是流协议而不是包协议
  • SpringBoot框架在共享汽车管理中的应用
  • 使用elementUI实现表格行拖拽改变顺序,无需引入外部库
  • 基于SpringBoot智慧社区管理平台
  • 力扣(LeetCode)LCR 179. 查找总价格为目标值的两个商品(Java)
  • Fabric.js中文教程
  • 唐帕科技校园语音报警系统:通过关键词识别,阻止校园霸凌事件
  • 网络基础 - 网段划分篇
  • 嵌入式硬件杂谈(一)-推挽 开漏 高阻态 上拉电阻
  • CHI 协议层 Retry —— CHI(8)
  • 安科瑞工业绝缘监测装置:保障煤矿井下6kV供电系统安全运行的关键应用——安科瑞 丁佳雯
  • Java使用Thumbnails进行图片处理
  • 《C++跨平台编译:打破系统边界,释放代码潜能》
  • pytest执行用例时从conftest.py抛出ModuleNotFoundError:No module named ‘XXX‘异常的解决办法
  • YOLOv8进阶实战:融合SAHI超推理算法,在无人机应用中精准捕捉视频与图片中的微小目标
  • 数据库运维实操优质文章文档分享(含Oracle、MySQL等) | 2024年10月刊
  • Avalonia UI 框架教程
  • Docker安装部署RabbitMQ(详细教程)
  • 【Java多线程】单例模式(饿汉模式和懒汉模式)