Java 并发编程 (二)CountDownLatch和CyclicBarrier的使用

news2024/11/17 11:23:04

CountDownLatch和CyclicBarrier

CountDownLatch

功能介绍

CountDownLatch 是一个同步功能的辅助类 线程计数不为0时呈wait状态如果为0则继续执行。通过await 和 countDown 两个方法来实现等待和继续运行。
作用:一个线程或多个线程等待另一个线程或多个线程完成后再继续执行。

public class MyCountDownLatch {

    private CountDownLatch countDownLatch = new CountDownLatch(1);

    public void test(){
        try {
            System.out.println("start await");
            //等待
            countDownLatch.await();
            System.out.println("end await");
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    public void downTest(){
        System.out.println("start countDown");
        countDownLatch.countDown();
    }

    @AllArgsConstructor
    @NoArgsConstructor
    public static class MyThread extends Thread{

        private MyCountDownLatch countDownLatch = new MyCountDownLatch();

        @Override
        public void run(){
            countDownLatch.test();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        MyCountDownLatch myCountDownLatch = new MyCountDownLatch();
        MyThread myThread = new MyThread(myCountDownLatch);
        myThread.start();
        Thread.sleep(1000);
        myCountDownLatch.downTest();
    }
}

在这里插入图片描述

await() 存在线程阻塞的风险 可以使用 await(long timeout, TimeUnit unit) 在最大时间内进入waiting状态,超过后会自动唤醒,防止阻塞
getCount() 可以获取当前计数的值

应用场景

  • 裁判员等待全部运动员回来
public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(5);
        System.out.println("start wait");
        for (int i = 0; i < 5; i++){
            MyThreadA myThreadA = new MyThreadA(countDownLatch);
            myThreadA.setName("runner" + i);
            myThreadA.start();
        }
        countDownLatch.await();
        System.out.println("all back");
    }

    @AllArgsConstructor
    @NoArgsConstructor
    public static class MyThreadA extends Thread{

        private CountDownLatch countDownLatch;

        @Override
        public void run(){
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " countDown");
            countDownLatch.countDown();
        }
    }

在这里插入图片描述

  • 准备比赛
public class MyCountDownLatch {

    private CountDownLatch countDownLatch = new CountDownLatch(1);

    public void awaitStart(){
        try {
            System.out.println(Thread.currentThread().getName() + " start await");
            countDownLatch.await();
            System.out.println(Thread.currentThread().getName() + " end await");
        } catch (Exception e){
            e.printStackTrace();
        }
    }

    public void downCount(){
        System.out.println(Thread.currentThread().getName() + " start countDown");
        countDownLatch.countDown();
    }

    @AllArgsConstructor
    @NoArgsConstructor
    public static class MyThread extends Thread{

        private MyCountDownLatch countDownLatch = new MyCountDownLatch();

        @Override
        public void run(){
            countDownLatch.awaitStart();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        MyCountDownLatch countDownLatch = new MyCountDownLatch();
        System.out.println("start wait");
        for (int i = 0; i < 3; i++){
            MyThread myThread = new MyThread(countDownLatch);
            myThread.setName("runner" + i);
            myThread.start();
        }
        Thread.sleep(2000);
        countDownLatch.downCount();
        System.out.println("all back");
    }
}

在这里插入图片描述

CyclicBarrier

功能介绍

CyclicBarrier 具有CountDownLatch的所有功能还可以实现屏障(阶段性同步)等能力。
作用:多个线程之间相互等待,任何一个线程完成之前所有线程都必须等待。
与CountDownLanch相同的功能不再介绍

public class MyCyclicBarrier {

    @AllArgsConstructor
    @NoArgsConstructor
    public static class MyThread extends Thread{

        private CyclicBarrier cyclicBarrier;

        @Override
        public void run() {

            try {
                cyclicBarrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }

        }
    }

    public static void main(String[] args) throws InterruptedException {

        CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
        MyThread myThread = new MyThread(cyclicBarrier);
        myThread.start();
        Thread.sleep(1000);
        System.out.println(cyclicBarrier.getNumberWaiting());

        MyThread myThread1 = new MyThread(cyclicBarrier);
        myThread1.start();
        Thread.sleep(1000);
        System.out.println(cyclicBarrier.getNumberWaiting());

        MyThread myThread2 = new MyThread(cyclicBarrier);
        myThread2.start();
        Thread.sleep(1000);
        System.out.println(cyclicBarrier.getNumberWaiting());

        MyThread myThread3 = new MyThread(cyclicBarrier);
        myThread3.start();
        Thread.sleep(1000);
        System.out.println(cyclicBarrier.getNumberWaiting());

    }
}

在这里插入图片描述

可以看出CyclicBarrier具有屏障的重制性计数值可以重制为0

isBroken() 查询屏障是否属于破损状态

getNumberWaiting() 查看有几个线程到达屏障点

getParties() 获取 parties 个数

reset() 重制屏障

应用场景

  • 阶段跑步比赛
public class MyCyclicBarrier {

    public CyclicBarrier cyclicBarrier = new CyclicBarrier(2);

    private void start(){
        try {
            int sleepValue = (int) (Math.random() * 10000);
            Thread.sleep(sleepValue);
            System.out.println(Thread.currentThread().getName() + " start 第一阶段");
            cyclicBarrier.await();
            System.out.println(Thread.currentThread().getName() + " end 第一阶段");

            int sleepValue1 = (int) (Math.random() * 10000);
            Thread.sleep(sleepValue1);
            System.out.println(Thread.currentThread().getName() + " start 第二阶段");
            cyclicBarrier.await();
            System.out.println(Thread.currentThread().getName() + " end 第二阶段");
        }catch (InterruptedException | BrokenBarrierException e){
            e.printStackTrace();
        }
    }

    @AllArgsConstructor
    @NoArgsConstructor
    public static class MyThread extends Thread{

        private MyCyclicBarrier cyclicBarrier;

        @Override
        public void run() {

            cyclicBarrier.start();

        }
    }

    public static void main(String[] args) throws InterruptedException {

        MyCyclicBarrier cyclicBarrier = new MyCyclicBarrier();
        MyThread myThread = new MyThread(cyclicBarrier);
        myThread.setName("myThread");
        myThread.start();
        Thread.sleep(1000);

        MyThread myThread1 = new MyThread(cyclicBarrier);
        myThread.setName("myThread1");
        myThread1.start();
        Thread.sleep(1000);

        MyThread myThread2 = new MyThread(cyclicBarrier);
        myThread.setName("myThread2");
        myThread2.start();
        Thread.sleep(1000);

        MyThread myThread3 = new MyThread(cyclicBarrier);
        myThread.setName("myThread3");
        myThread3.start();
        Thread.sleep(1000);

    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137743.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2003-2021年高铁列车信息

2003-2021年高铁列车信息 1、时间&#xff1a;2003-2021年 2、指标&#xff1a; 列车车次、出发站、出发站所属地级市、出发站所属省份、出发站类型、到达站、到达站所属地级市、到达站所属省份、到达站类型、车型、开车时间、到站时间、运行时间、里程 3、指标说明&#x…

58. 微调(fine-tuning)

前面的一些章节介绍了如何在只有6万张图像的Fashion-MNIST训练数据集上训练模型。 我们还描述了学术界当下使用最广泛的大规模图像数据集ImageNet&#xff0c;它有超过1000万的图像和1000类的物体。 然而&#xff0c;我们平常接触到的数据集的规模通常在这两者之间。 假如我们…

3、基于注解的IoC装配与依赖注入

一、XML开启注解支持 1、添加context名称空间 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context&…

03SpringCloudAlibaba服务注册中心—Zookeeper

目录 注册中心Zookeeper 五步曲&#xff1a; zookeeper服务提供者 1、03-cloud-provider-payment-zookeeper-8004 2、pom.xml 3、改yum 4、主启动 5、业务类 测试1&#xff1a; 测试2&#xff1a; ​ 服务节点是临时节点还是持久节点 粗划分&#xff1a; 细划分&am…

南京晓庄Java期末知识点复习

南京晓庄Java期末知识点复习第一章 Java 语言概述第二章 Java 语法基础标识符基本数据类型**运算符****语句**数组和字符串命令行参数输入输出第三章 类五个基本概念类类的封装类的继承**抽象类**接口关键字常用的工具类第四章 Applet及其应用**Java程序的两种基本形式****Appl…

红队渗透靶场之prime1.0(超详细!)

靶场考察知识 Wordpress WordPress是一个免费的开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;可以用来创建和管理网站或博客。它是由PHP语言和MySQL数据库构建的&#xff0c;并且拥有大量的插件和主题&#xff0c;可以让您轻松地自定义网站的外观和功能 Wpscan扫…

引用量超6000的语义分割经典论文DeepLabv3解读

分享语义分割领域的一篇经典论文DeepLabv3&#xff0c;由谷歌发表于CVPR2017。开源代码地址&#xff1a; Tensorflow版本&#xff1a;https://github.com/tensorflow/models/tree/master/research/deeplabPytorch版本&#xff1a;https://github.com/open-mmlab/mmsegmentatio…

【Spring 入门教程3】

Spring_day03 &#x1f308;博客主页&#xff1a;屠一乐的博客 &#x1f4c5; 发文时间&#xff1a;2023.1.3 &#x1f388; 一定存在只有你才能做成的事 &#x1f339; 博主水平有限&#xff0c;如有错误&#xff0c;欢迎指正 欢迎各位&#x1f44d;收藏&#x1f48e;评论✉ …

mysql简介

一.mysql简介 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&a…

TensorFlow之过拟合与欠拟合-3

1 基本概念 过度拟合&#xff08;overfit&#xff09; 正则化&#xff08;regularization&#xff09; L1正则化&#xff08;L1 regularization&#xff09; L2正则化&#xff08;L2 regularization&#xff09; 删除正则化&#xff08;dropout regularization&#xff09…

【计组】异常、CPU指令集--《深入浅出计算机组成原理》(五)

课程链接&#xff1a;深入浅出计算机组成原理_组成原理_计算机基础-极客时间 一、异常 &#xff08;一&#xff09;异常 异常其实是一个硬件和软件组合到一起的处理过程。异常的发生和捕捉&#xff0c;是在硬件层面完成的。但是异常的处理&#xff0c;是由软件来完成的。 …

【并发编程十】c++线程同步——条件变量(condition_variable)

【并发编程十】c线程同步——条件变量&#xff08;condition_variable&#xff09;一、互斥二、条件变量1、为何要引入条件变量?2、不使用条件变量3、使用条件变量3.1、互斥锁有什么问题&#xff1f;3.2、条件变量3.3、条件变量成员函数3.4、demo三、future四、信号量简介&…

【并发编程九】c++线程同步——互斥(mutex)

【并发编程九】c线程同步——互斥&#xff08;mutex&#xff09;一、互斥1、mutex1.1、mutex1.2、 lock_guard1.3、 RAII2、std::recursive_mutex3、std::shared_mutex、std::shared_lock、std::unique_lock4、std::scoped_lock二、条件变量三、future四、信号量简介&#xff1…

chrony服务器

Chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器&#xff08;NTP&#xff09;同步&#xff0c;因此让你的计算机保持精确的时间&#xff0c;Chrony也可以作为服务端软件为其他计算机提供时间同步服务。 Chrony由两个程序…

【嵌入式Linux环境搭建-10】tftp服务安装、双网卡并行

10.tftp服务安装 板子有有线网卡&#xff0c;需有线连接到电脑 主机安装TFTP服务 $ sudo apt-get install xinetd tftpd tftp $ sudo vim /etc/xinetd.d/tftp /*添加下面内容, service tftp { protocol udp port 69 socket_type dgram wait …

aws lambda 理解RIC和RIE构建和测试容器镜像并通过cdk部署lambda函数

参考资料 AWS Lambda 的新功能 — 容器映像支持 快速构建基于 Lambda 容器镜像的 OCR 应用 利用 Lambda 容器镜像搭建分布式压测引擎 lambda容器镜像构建 可以将 Lambda 函数打包和部署最大 10 GB 的容器映像&#xff0c;轻松构建和部署依赖于大量依赖项的更大型工作负载 …

【Java核心技术】创建多线程

1、多线程的概述 什么是线程&#xff1f; 线程(thread)是一个程序内部的一条执行路径。 我们之前启动程序执行后&#xff0c;main方法的执行其实就是一条单独的执行路径。 public static void main(String[] args) {// 代码...for (int i 0; i < 10; i) {System.out.prin…

《柳叶刀》:约20%中国男性死亡可归因于吸烟

*仅供医学专业人士阅读参考 吸烟喝酒可谓众所周知的两大“健康刺客”。一首歌名为《给我一杯酒》中的歌词唱到“给我一杯酒&#xff0c;再给我一只烟&#xff0c;说走就走&#xff0c;我有的是时间”&#xff0c;传唱度极高&#xff0c;甚至还一度成为短视频平台的最热门的BGM之…

概论_第2章_重点内容__随机变量函数的概率分布

一 定义 概括地说&#xff1a; 随机变量Y是随机变量X的函数。 设g(x) 是一给定的连续函数&#xff0c; 称Yg(X) 为随机变量X的一个函数&#xff0c; Y也是一个随机变量。当X取值 时&#xff0c;Y取值 . ~~~~~~~~~~~~~~ 本文讨论连续型随机变量函数。 定理1: 设X为连续型…

Appium环境搭建及元素定位

01 Appium简介 Appium是一个开源测试自动化框架&#xff0c;可用于原生&#xff0c;混合和移动Web应用程序测试。它使用WebDriver 协议驱动iOS&#xff0c;Android和Windows应用程序。 01 环境搭建步骤 Appium环境安装&#xff1a; 第一步 安装 appium 桌面版客户端 Appium…