并发工具类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

相关文章

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

基于.NET编写工具类解决JSON乱码问题

《基于.NET编写工具类解决JSON乱码问题》在开发过程中,我们经常会遇到JSON数据处理的问题,尤其是在数据传输和解析过程中,很容易出现编码错误导致的乱码问题,下面我们就来编写一个.NET工具类来解... 目录问题背景核心原理工具类实现使用示例总结在开发过程中,我们经常会遇到jsON数据处理的问题,尤其是

Java中有什么工具可以进行代码反编译详解

《Java中有什么工具可以进行代码反编译详解》:本文主要介绍Java中有什么工具可以进行代码反编译的相关资,料,包括JD-GUI、CFR、Procyon、Fernflower、Javap、Byte... 目录1.JD-GUI2.CFR3.Procyon Decompiler4.Fernflower5.Jav

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins

MobaXterm远程登录工具功能与应用小结

《MobaXterm远程登录工具功能与应用小结》MobaXterm是一款功能强大的远程终端软件,主要支持SSH登录,拥有多种远程协议,实现跨平台访问,它包括多会话管理、本地命令行执行、图形化界面集成和... 目录1. 远程终端软件概述1.1 远程终端软件的定义与用途1.2 远程终端软件的关键特性2. 支持的

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多