首页 > 其他分享 >CyclicBarrier 使用

CyclicBarrier 使用

时间:2024-06-06 13:11:17浏览次数:14  
标签:Thread show 贾冰 约会 热巴 使用 new CyclicBarrier

CyclicBarrier 同步屏障

和CountDownLatch类似

可循环使用的屏障,一组线程到达屏障时被阻塞,直到最后一个线程到达时,屏障才开门,所有被拦截的线程继续执行。

例如:

渣男贾冰,要和3个女生,按照顺序挨个约会:第一个是娜扎,第二个是热巴,第三个是柳岩

第一个娜扎先和贾冰约会 第二个热巴可以在家多睡3秒钟,等贾冰和娜扎约完了 第三个柳岩可以在家多睡6秒钟,等贾冰和热巴约完了
public class CyclicBarrierTest {

    private static String girl = "【娜扎】";

    public static void main(String[] args) {
        //设置屏障等待数量为2个
        CyclicBarrier cyclicBarrier = new CyclicBarrier(2,
                () -> System.out.println("贾冰的约会对象是:" + girl));

        //贾冰线程
        Thread a1 = new Thread(() -> {
            try {
                //每次约会完休息3秒
                show("等待第1个约会对象");
                cyclicBarrier.await();
                show("第1个约会太累,休息1秒======================");
                Thread.sleep(1000);

                show("等待第2个约会对象");
                girl = "【热巴】";
                cyclicBarrier.await();
                show("第2个约会太累,休息1秒======================");
                Thread.sleep(1000);


                show("等待第3个约会对象");
                girl = "【柳岩】";
                cyclicBarrier.await();
                show("第3个约会太累,暂停营业,回家休息======================");
                Thread.sleep(1000);

            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }, "贾冰");

        //娜扎线程
        Thread a2 = new Thread(() -> {
            try {
                show("贾哥哥久等了");
                cyclicBarrier.await();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }, "娜扎");

        //热巴线程
        Thread a3 = new Thread(() -> {
            try {
                show("睡个懒觉3秒");
                Thread.sleep(3000);
                show("贾哥哥久等了");
                cyclicBarrier.await();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }, "热巴");

        //柳岩线程
        Thread a4 = new Thread(() -> {
            try {
                show("睡个懒觉6秒");
                Thread.sleep(6000);
                show("贾哥哥久等了");
                cyclicBarrier.await();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }, "柳岩");


        a1.start();
        a2.start();
        a3.start();
        a4.start();
    }
   //加线程名称显示信息
    private static void show(String s) {
        System.out.println(Thread.currentThread().getName() + ":" + s);
    }
}

输出结果:

贾冰:等待第1个约会对象
柳岩:睡个懒觉6秒
热巴:睡个懒觉3秒
娜扎:贾哥哥久等了
贾冰的约会对象是:【娜扎】
贾冰:第1个约会太累,休息1秒======================
贾冰:等待第2个约会对象
热巴:贾哥哥久等了
贾冰的约会对象是:【热巴】
贾冰:第2个约会太累,休息1秒======================
贾冰:等待第3个约会对象
柳岩:贾哥哥久等了
贾冰的约会对象是:【柳岩】
贾冰:第3个约会太累,暂停营业,回家休息======================

 

 核心方法:

方法功能
await() 等待latch为0
await(long timeout, TimeUnit unit) 等待latch为0,或者超时

 

 

 

 

标签:Thread,show,贾冰,约会,热巴,使用,new,CyclicBarrier
From: https://www.cnblogs.com/etangyushan/p/18234952

相关文章

  • vue2 路由基础 -- 基础使用
    @[TOC](vue2路由(一)–基础使用)vue使用vue-router插件处理路由,路由是开发单页应用必须掌握的知识。什么是vue-router?(1)vue-router是Vue官方提供前端路由插件,借助它我们实现可以基于路由和组件的单页面应用。(2)它与传统的页面区别在于:传统的页面应用采用的是后......
  • C# .NET 6 使用WorkFlow Core 创建工作审批流
    1,背景工作流思想在上世纪60年代就有人提出过;70年代就有人开始尝试,但是由于当时许多的限制,工作流一直没有成功的被实现;80年代才出现第一批成功的工作流系统;90年代工作流技术走向了第一个发展高峰期;90年代后至今工作流出现了很多版本,但是主旨还是不变的,为了使我们的工作变得更......
  • 使用Visual Studio分析.NET Dump
    前言内存泄漏和高CPU使用率是在日常开发中经常遇到的问题,它们可能会导致应用程序性能下降甚至崩溃。今天我们来讲讲如何使用VisualStudio2022分析.NETDump,快速找到程序内存泄漏问题。什么是Dump文件?Dump文件又叫内存转储文件或者叫内存快照文件。用于存储程序运行时的状态......
  • 逃离AI陷阱:如何使用AI写论文工具提升学术写作
    在学术探索的征途中,AI论文工具本应是助力前行的风帆,而非让人陷入困境的漩涡。我完全理解大家在面对论文压力的同时,遭遇不靠谱AI工具的沮丧与无奈。毕竟,时间可以被浪费,但金钱和信任却不可轻弃。作为一名资深的AI工具探索者,我在此分享一些经过我亲自验证、值得信赖的AI论文辅助......
  • MySQL Shell 的简单使用
    util.dumpTables():导出表util.dumpSchemas():导出单个或多个schemautil.dumpInstance():导出整个实例 util.dumpTables()的使用语法:util.dumpTables(schema,tables,outputUrl[,options])其中:·schema:是表所在的schema·tables:是一个数组,表示要导出的表的列表·outp......
  • C# .NET 6 使用WorkFlow Core 创建工作审批流
    1,背景工作流思想在上世纪60年代就有人提出过;70年代就有人开始尝试,但是由于当时许多的限制,工作流一直没有成功的被实现;80年代才出现第一批成功的工作流系统;90年代工作流技术走向了第一个发展高峰期;90年代后至今工作流出现了很多版本,但是主旨还是不变的,为了使我们的工作变得更......
  • vue框架页面外链进来加"/"拼接参数的使用及获取;PC及手机端的判断;
     一开始没有看懂,后来知道了 他的意思 就是在pages目录下的页面,如果需要通过比如'pages/qr/56'这种斜杠链接进入的话 就需要吧detail.vue页面变成目录结构,页面名称改为'_'+参数名;如下图 然后在_code页面可以通过如下方式获取code值进行操作:mounted(){constc......
  • 使用CRaC为JVM创建checkpoint
    CRaCCoordinatedRestoreatCheckpoint,缩写为CRaC,大致的原理是将JVM的当前运行状态进行持久化存储起来,再条件JDK版本:17及以上,建议17或21OpenJDK发行版,目前支持CRaC的JDK有两家:ZuluJDK:发行商为Azul,下载地址:https://www.azul.com/downloads/?version=java-17-lts&os=c......
  • >>>0是一个位操作符,具体解释一下,并给出几个使用示例和常见场景
    >>>是JavaScript中的无符号右移位运算符。它将操作数的所有位向右移动指定位数,丢弃被移出的位,并在左侧填充零。特别地,>>>0是一个常用的技巧,用于确保任何数字(包括负数)都被转换为无符号的32位整数。这意味着结果总是非负的,并且范围在0到2^32-1之间。具体解释符号位处理:在二进......
  • react中推荐使用发布订阅模式,进行跨多层级的组件间通信和事件传递吗?
    在React中,虽然发布订阅模式(Pub/Sub)可以作为一种实现跨多层级组件间通信的方法,但它并不是React官方推荐的主要手段,尤其是在ReactHooks和ContextAPI普及之后。React推荐的跨组件通信方法主要包括:Propsdrilling:最直接的方式,通过props从父组件向子组件传递数据,适合简单的数据流......