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

相关文章

python版本切换工具pyenv的安装及用法

《python版本切换工具pyenv的安装及用法》Pyenv是管理Python版本的最佳工具之一,特别适合开发者和需要切换多个Python版本的用户,:本文主要介绍python版本切换工具pyen... 目录Pyenv 是什么?安装 Pyenv(MACOS)使用 Homebrew:配置 shell(zsh

C# Semaphore与SemaphoreSlim区别小结

《C#Semaphore与SemaphoreSlim区别小结》本文主要介绍了C#Semaphore与SemaphoreSlim区别小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、核心区别概览二、详细对比说明1.跨进程支持2.异步支持(关键区别!)3.性能差异4.API 差

Python+wxPython开发一个文件属性比对工具

《Python+wxPython开发一个文件属性比对工具》在日常的文件管理工作中,我们经常会遇到同一个文件存在多个版本,或者需要验证备份文件与源文件是否一致,下面我们就来看看如何使用wxPython模... 目录引言项目背景与需求应用场景核心需求运行结果技术选型程序设计界面布局核心功能模块关键代码解析文件大

python协程实现高并发的技术详解

《python协程实现高并发的技术详解》协程是实现高并发的一种非常高效的方式,特别适合处理大量I/O操作的场景,本文我们将简单介绍python协程实现高并发的相关方法,需要的小伙伴可以了解下... 目录核心概念与简单示例高并发实践:网络请求协程如何实现高并发:核心技术协作式多任务与事件循环非阻塞I/O与连接

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

Java JUC并发集合详解之线程安全容器完全攻略

《JavaJUC并发集合详解之线程安全容器完全攻略》Java通过java.util.concurrent(JUC)包提供了一整套线程安全的并发容器,它们不仅是简单的同步包装,更是基于精妙并发算法构建... 目录一、为什么需要JUC并发集合?二、核心并发集合分类与详解三、选型指南:如何选择合适的并发容器?在多

Java 结构化并发Structured Concurrency实践举例

《Java结构化并发StructuredConcurrency实践举例》Java21结构化并发通过作用域和任务句柄统一管理并发生命周期,解决线程泄漏与任务追踪问题,提升代码安全性和可观测性,其核心... 目录一、结构化并发的核心概念与设计目标二、结构化并发的核心组件(一)作用域(Scopes)(二)任务句柄

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

使用python制作一款文件粉碎工具

《使用python制作一款文件粉碎工具》这篇文章主要为大家详细介绍了如何使用python制作一款文件粉碎工具,能够有效粉碎密码文件和机密Excel表格等,感兴趣的小伙伴可以了解一下... 文件粉碎工具:适用于粉碎密码文件和机密的escel表格等等,主要作用就是防止 别人用数据恢复大师把你刚删除的机密的文件恢

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2