并发工具类CountDownLatch、CyclicBarrier、Semaphore 、Exchanger

本文主要是介绍并发工具类CountDownLatch、CyclicBarrier、Semaphore 、Exchanger,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

CountDownLatch

    await(),进入等待的状态

    countDown,计数器减一

   简单例子 某些代码需要等待其他的一系列线程执行完毕后才能执行,如下实现当for循环中的线程执行完后打印出多线程执行完毕。

import java.util.concurrent.CountDownLatch;/****/
public class CountDownLatchDemo {public static void main(String[] args) throws InterruptedException{CountDownLatch countDownLatch = new CountDownLatch(8);new Thread(()->{try {countDownLatch.await();}catch (InterruptedException e){e.printStackTrace();}System.out.println("多线程运行完毕!");}).start();for(int i=0;i<8;i++){int finalI = i;new Thread(()->{try {Thread.sleep(finalI*1000L);}catch (InterruptedException e){e.printStackTrace();}finally {countDownLatch.countDown();}System.out.println(Thread.currentThread().getName()+"运行完毕");}).start();}}
}

运行结果

CyclicBarrier

    允许一组线程相互等待达到一个共同的障碍点,之后再继续执行

     和CountDownLatch的区别

         CountDownLatch一般用于一个线程等待若干个其他线程执行完成任务之后,它才执行,不可重复使用;CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行,可重用。

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;public class CyclicBarrierDemo {public static void main(String[] args) {CyclicBarrier cyclicBarrier  = new CyclicBarrier(5);for (int i = 0; i<5;i++){int finalI = i;new Thread(()->{try {Thread.sleep(finalI*500L);System.out.println(Thread.currentThread().getName()+"等待就绪");cyclicBarrier.await();}catch (InterruptedException e){e.printStackTrace();}catch (BrokenBarrierException e){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"开始运行");}).start();}}
}

运行结果:

Semaphore -- 信号量

    控制并发数量

    使用场景:接口限流

import java.util.concurrent.Semaphore;public class SemaphoreDemo {public static void main(String[] args) {Semaphore semaphore = new Semaphore(5);for (int i = 0;i<10;i++){new Thread(()->{try {semaphore.acquire();System.out.println(Thread.currentThread().getName()+"开始运行");Thread.sleep(5000L);}catch (InterruptedException e){e.printStackTrace();}finally {semaphore.release();System.out.println(Thread.currentThread().getName()+"结束运行");}}).start();}}
}

运行结果:上述代码开启是个线程,但是只能同时运行五个,控制了并发数量

Exchanger

    用于交换数据

    它提供一个共同点,在这个同步点两个线程可以交换彼此的数据。这两个线程通过Exchange方法交换数据,如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange,当两个线程都达到同步点是,这两个线程可以交换数据,将本线程生成出来的数据传递给对方。因此使用Exchanger的重点是成对的线程使用exchange()方法,当有一对线程达到同步点,就会进行数据交换。因此该工具类的对象是【成对】的。

import java.util.concurrent.Exchanger;public class ExchangerDemo {public static void main(String[] args) {Exchanger<String> exchanger = new Exchanger<>();String[] strArray = {"zhangsan","lisi","wamhwu"};for (int i= 0;i<3;i++){int finalI = i;new Thread(()->{System.out.println(Thread.currentThread().getName()+"待交换值为:"+strArray[finalI]);try {String exchangerStr =  exchanger.exchange(strArray[finalI]);System.out.println(Thread.currentThread().getName()+"交换后的值为:"+exchangerStr);}catch (InterruptedException e){e.printStackTrace();}}).start();}}
}

运行结果:线程0和线程1成功交换数据,线程2由于没有与之交换数据的线程会进入等待状态。

这篇关于并发工具类CountDownLatch、CyclicBarrier、Semaphore 、Exchanger的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/542053

相关文章

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

高并发环境中保持幂等性

在高并发环境中保持幂等性是一项重要的挑战。幂等性指的是无论操作执行多少次,其效果都是相同的。确保操作的幂等性可以避免重复执行带来的副作用。以下是一些保持幂等性的常用方法: 唯一标识符: 请求唯一标识:在每次请求中引入唯一标识符(如 UUID 或者生成的唯一 ID),在处理请求时,系统可以检查这个标识符是否已经处理过,如果是,则忽略重复请求。幂等键(Idempotency Key):客户端在每次

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

超强的截图工具:PixPin

你是否还在为寻找一款功能强大、操作简便的截图工具而烦恼?市面上那么多工具,常常让人无从选择。今天,想给大家安利一款神器——PixPin,一款真正解放双手的截图工具。 想象一下,你只需要按下快捷键就能轻松完成多种截图任务,还能快速编辑、标注甚至保存多种格式的图片。这款工具能满足这些需求吗? PixPin不仅支持全屏、窗口、区域截图等基础功能,它还可以进行延时截图,让你捕捉到每个关键画面。不仅如此

Java并发编程之——BlockingQueue(队列)

一、什么是BlockingQueue BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种: 1. 当队列满了的时候进行入队列操作2. 当队列空了的时候进行出队列操作123 因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作;同样,当一个线程试图对一个空

PR曲线——一个更敏感的性能评估工具

在不均衡数据集的情况下,精确率-召回率(Precision-Recall, PR)曲线是一种非常有用的工具,因为它提供了比传统的ROC曲线更准确的性能评估。以下是PR曲线在不均衡数据情况下的一些作用: 关注少数类:在不均衡数据集中,少数类的样本数量远少于多数类。PR曲线通过关注少数类(通常是正类)的性能来弥补这一点,因为它直接评估模型在识别正类方面的能力。 精确率与召回率的平衡:精确率(Pr

husky 工具配置代码检查工作流:提交代码至仓库前做代码检查

提示:这篇博客以我前两篇博客作为先修知识,请大家先去看看我前两篇博客 博客指路:前端 ESlint 代码规范及修复代码规范错误-CSDN博客前端 Vue3 项目开发—— ESLint & prettier 配置代码风格-CSDN博客 husky 工具配置代码检查工作流的作用 在工作中,我们经常需要将写好的代码提交至代码仓库 但是由于程序员疏忽而将不规范的代码提交至仓库,显然是不合理的 所

10个好用的AI写作工具【亲测免费】

1. 光速写作 传送入口:http://u3v.cn/6hXWYa AI打工神器,一键生成文章&ppt 2. 讯飞写作 传送入口:http://m6z.cn/5ODiSw 3. 讯飞绘文 传送入口:https://turbodesk.xfyun.cn/?channelid=gj3 4. AI排版助手 传送入口:http://m6z.cn/6ppnPn 5. Kim

分享5款免费录屏的工具,搞定网课不怕错过!

虽然现在学生们不怎么上网课, 但是对于上班族或者是没有办法到学校参加课程的人来说,网课还是很重要的,今天,我就来跟大家分享一下我用过的几款录屏软件=,看看它们在录制网课时的表现如何。 福昕录屏大师 网址:https://www.foxitsoftware.cn/REC/ 这款软件给我的第一印象就是界面简洁,操作起来很直观。它支持全屏录制,也支持区域录制,这对于我这种需要同时录制PPT和老师讲

java线程深度解析(五)——并发模型(生产者-消费者)

http://blog.csdn.net/Daybreak1209/article/details/51378055 三、生产者-消费者模式     在经典的多线程模式中,生产者-消费者为多线程间协作提供了良好的解决方案。基本原理是两类线程,即若干个生产者和若干个消费者,生产者负责提交用户请求任务(到内存缓冲区),消费者线程负责处理任务(从内存缓冲区中取任务进行处理),两类线程之