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

相关文章

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

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

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

Spring Security 前后端分离场景下的会话并发管理

《SpringSecurity前后端分离场景下的会话并发管理》本文介绍了在前后端分离架构下实现SpringSecurity会话并发管理的问题,传统Web开发中只需简单配置sessionManage... 目录背景分析传统 web 开发中的 sessionManagement 入口ConcurrentSess

MySQL慢查询工具的使用小结

《MySQL慢查询工具的使用小结》使用MySQL的慢查询工具可以帮助开发者识别和优化性能不佳的SQL查询,本文就来介绍一下MySQL的慢查询工具,具有一定的参考价值,感兴趣的可以了解一下... 目录一、启用慢查询日志1.1 编辑mysql配置文件1.2 重启MySQL服务二、配置动态参数(可选)三、分析慢查

MySQL中处理数据的并发一致性的实现示例

《MySQL中处理数据的并发一致性的实现示例》在MySQL中处理数据的并发一致性是确保多个用户或应用程序同时访问和修改数据库时,不会导致数据冲突、数据丢失或数据不一致,MySQL通过事务和锁机制来管理... 目录一、事务(Transactions)1. 事务控制语句二、锁(Locks)1. 锁类型2. 锁粒

深入解析Java NIO在高并发场景下的性能优化实践指南

《深入解析JavaNIO在高并发场景下的性能优化实践指南》随着互联网业务不断演进,对高并发、低延时网络服务的需求日益增长,本文将深入解析JavaNIO在高并发场景下的性能优化方法,希望对大家有所帮助... 目录简介一、技术背景与应用场景二、核心原理深入分析2.1 Selector多路复用2.2 Buffer

基于Python实现进阶版PDF合并/拆分工具

《基于Python实现进阶版PDF合并/拆分工具》在数字化时代,PDF文件已成为日常工作和学习中不可或缺的一部分,本文将详细介绍一款简单易用的PDF工具,帮助用户轻松完成PDF文件的合并与拆分操作... 目录工具概述环境准备界面说明合并PDF文件拆分PDF文件高级技巧常见问题完整源代码总结在数字化时代,PD

Python按照24个实用大方向精选的上千种工具库汇总整理

《Python按照24个实用大方向精选的上千种工具库汇总整理》本文整理了Python生态中近千个库,涵盖数据处理、图像处理、网络开发、Web框架、人工智能、科学计算、GUI工具、测试框架、环境管理等多... 目录1、数据处理文本处理特殊文本处理html/XML 解析文件处理配置文件处理文档相关日志管理日期和

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

go动态限制并发数量的实现示例

《go动态限制并发数量的实现示例》本文主要介绍了Go并发控制方法,通过带缓冲通道和第三方库实现并发数量限制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录带有缓冲大小的通道使用第三方库其他控制并发的方法因为go从语言层面支持并发,所以面试百分百会问到