java并发-Exchanger

Exchanger 到底能干嘛?99% 的程序员都没用过的 Java API! 我知道很多人在刷题时更偏爱热门的 ReentrantLock、ThreadPoolExecutor、Semaphore,但其实像 Exchanger 这种“冷门 API”也是 Java 并发世界中不可忽视的宝藏。会用工具,是初级程序员;知道什么时候该用什么工具,是中高级程序员;懂得底层原理,能优化使用场景,是架构师。所以,别看 Exchanger 平常用得少,但它在对的地方能发挥出 100% 的威力。 阅读详情

## 简介

Exchanger是Java并发包中提供的一个用于线程间数据交换的工具类。它允许在两个并发任务之间进行交换对象,当第一个任务调用exchange()方法时,它会阻塞等待另一个任务也调用这个方法,然后双方交换对象,并返回结果,因此它可以在多线程编程中非常有用。

## 底层实现

Exchanger的底层实现基于AQS(AbstractQueuedSynchronizer)同步器,并使用了类似于管道的结构,它维护了两个格子,一个是slot1,另一个是slot2,线程1放入的对象会保存在slot1中,线程2放入的对象会保存在slot2中,当双方都调用exchange()方法时,会互相交换slot中的对象,并返回,让线程1获取到线程2放入的对象,线程2获取到线程1放入的对象,然后两个格子就会重新变成空的,以便下一次交换使用。

另外,Exchanger使用LockSupport实现线程的阻塞和唤醒,以避免使用Object.wait()和Object.notify()方法时出现死锁等问题。

## 应用场景

Exchanger的应用场景非常广泛,以下是一些常见的案例:

1. 网络爬虫

可以利用多线程从不同的网站上抓取信息,然后使用Exchanger将两个线程得到的信息交换,以便进行处理分析。

2. 数据库操作

有一些应用场景需要对数据库中的数据进行批量处理,可以使用Exchanger将两个线程处理的结果进行交换,以达到提高效率的目的。

3. 多线程任务

多线程任务分为生产者和消费者两部分,Exchanger可以用于在两个任务之间进行数据的交换,大大提高效率。

## 示例代码

以下是一个使用Exchanger实现两个线程交换数据的示例:

```java
import java.util.concurrent.Exchanger;

public class ExchangerThreadDemo {
    public static void main(String[] args) {
        Exchanger<String> exchanger = new Exchanger<>();
        new Thread(() -> {
            try {
                String data1 = exchanger.exchange("data1");
                System.out.println(Thread.currentThread().getName() + " received: " + data1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "Thread-1").start();

        new Thread(() -> {
            try {
                String data2 = exchanger.exchange("data2");
                System.out.println(Thread.currentThread().getName() + " received: " + data2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "Thread-2").start();
    }
}
```

运行该示例,输出结果如下:

```
Thread-2 received: data1
Thread-1 received: data2
```

可以看到,两个线程交换了自己的数据,并接收到了对方交换的数据。

总之,Exchanger是一个非常强大的线程间数据交换工具类,可以极大地提高Java并发程序的效率和灵活性。

GPU运维面试题 【代码】GPU运维面试题。 阅读详情

相关推荐

openvpn 安装 (Alibaba Cloud Linux release 3 (Soaring Falcon))

1.错误:configure: error: libnl-genl-3.0 package not found or too old. Is the development package and pkg-config (/usr/bin/pkg-config) installed?# ta.key在/etc/openvpn/server/目录下可以如下配置,否则需要写完整路径。# 配置账号密码登录客户端需要ca证书(可选)# 证书校验算法 配置上面生成的完整路径。# ca证书 配置上面生成的完整路径。

dubhe_zhao的博客 2148

并发编程之Exchanger原理与使用

在JUC包中,除了一些常用的或者说常见的并发工具类(ReentrantLock,CountDownLatch,CyclicBarrier,Semaphore)等,还有一个不常用的线程同步器类 —— Exchanger。Exchanger是适用在两个线程之间数据交换的并发工具类,它的作用是找到一个同步点,当两个线程都执行到了同步点(exchange方法)之后(有一个没有执行到就一直等待,也可以设置等待超时时间),就将自身线程的数据与对方交换。

meser88的博客 1798

Stata实战:5步搞定PSM倾向得分匹配(附完整代码与常见报错解决)

本文详细介绍了使用Stata进行PSM(倾向得分匹配)的5步实战流程,包括数据预处理、模型构建、匹配算法选择、匹配质量诊断和结果解释。提供完整代码示例和常见报错解决方案,帮助研究者高效完成实证分析,提升匹配成功率。

weixin_29214559的博客 590

java-Exchanger详解

Exchanger类可用于在两个类型为T的线程之间共享对象。该类仅提供了一个重载的方法exchange(T t)。当调用exchanger时,它会等待成对的另一个线程也调用它。在这一点上,第二个线程发现第一个线程正在等待其对象。线程交换它们持有的对象并发出交换信号,然后它们可以返回。让我们看一个例子,以理解两个线程之间使用Exchanger@Testtry {try {在这里,我们有两个线程使用共同的Exchanger交换彼此之间的消息。@Testtry {

大乐乐 1307

UFS 3.1协议分析(第一至四章) -- UFS概述

Contents协议规范规范参考术语和定义简单概述通用特性接口特性功能特性 协议规范     UFS3.1协议规定了UFS电气接口和存储器件的特性以及系统架构。 特性:低功耗、高数据吞吐量、低电磁干扰、大容量存储器子系统效率的优化 电气接口:使用基于MIPI M-PHY的高级差分接口;M-PHY作为物理层,MIPI UniPro作为链路层,二者结合形成UFS接口的互联。 架构模型:参考 INCITS T10(SCSI) SAM 标准,命令协议基于 INCITS T1

Frank_sample的专栏 1万+

STM32F103VET6实战:用W25Q64外部Flash实现Bootloader远程升级(含完整代码解析)

本文详细介绍了基于STM32F103VET6与W25Q64外部Flash的Bootloader远程升级实现方案,包含硬件选型、存储分区策略、双校验机制及完整代码解析。通过SPI接口实现固件存储与升级,适用于物联网设备开发,提升OTA功能可靠性。

weixin_42620340的博客 357

java并发Exchanger的使用

简介 Exchanger是java 5引入的并发类,Exchanger顾名思义就是用来做交换的。这里主要是两个线程之间交换持有的对象。当Exchanger在一个线程中调用exchange方法之后,会等待另外的线程调用同样的exchange方法。 两个线程都调用exchange方法之后,传入的参数就会交换。 类定义 public class Exchanger<V> 其中V表示需要交换的对象类型。 类继承 java.lang.Object ↳ java.util.concurrent.Excha

m0_66876551的博客 3056

【异常】Hermes Agent调用z.ai接口失败(余额不足)API call failed (attempt 1/3): RateLimitError [HTTP 429]

补充说明:同步尝试解析接口对应网页时,出现“网页解析失败,可能是不支持的网页类型,请检查网页或稍后重试”提示,该提示不影响核心报错排查,仅作为辅助信息。

奶爸的编程之路,也就一周冷个三天 1194

java多线程学习之【Exchanger】

本文主要是讲解Exchanger的概念,基本用法,使用场景,底层代码原理剖析。按照源码注释,翻译成中文,就是以下内容:Exchanger 提供了一些方法:Exchanger应用在遗传算法和管道的设计。 四、源码剖析 Exchanger 的源码在JUC并发工具中,相对简单: exchange及关联代码 五、和其他工具比较 Exchanger,Semaphore,CountDownLatch与CyclicBarrier区别 总结 主要讲解Exchanger,后面重点讲AQS。...

blackoon88的博客 761

Vite 任意文件读取漏洞复现(CVE-2026-39363)

Vite开发服务器 WebSocket中的fetchModule方法未实施server.fs访问控制,导致攻击者可通过WebSocket连接并读取服务器上的任意文件(CVE-2026-39363)

iSee857的博客 219

如何使用freesurfer对T1w结构像进行分区指标的提取?——皮层面积,灰质体积,平均厚度,厚度标准差,平均曲率、高斯曲率、曲率指数、折叠指数

如何使用freesurfer对T1w结构像进行分区指标的提取?——皮层面积,灰质体积,平均厚度,厚度标准差,平均曲率、高斯曲率、曲率指数、折叠指数

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 3787

Java并发——Exchanger

Exchanger Exchanger的功能可以使2个线程之间传输数据,它比生产者/消费者模式使用的 wait/notify要更加方便。 exchange()阻塞的特性: public class ThreadA extends Thread{ private Exchanger<String> exchanger; public ThreadA(Exchanger<String> exchanger) { this.exchanger = exch

吴声子夜歌的博客 284

SQL中的时间计算:员工每日工作时长

摘要:本文介绍了一个使用SQL查询计算员工每日工作时长的实用方法。通过分析包含员工打卡记录的数据库表,利用CTE(公共表表达式)将日期分组,计算最早和最晚打卡时间差,最终以"小时:分钟"格式输出工作时长。该方法适用于每日两次打卡的场景,并提示了处理漏打卡等特殊情况时的注意事项,为企业考勤管理提供了有效的数据支持方案。(148字)

m0_74337424的博客 412

java并发编程-Exchanger

Exchanger 作用:两个线程之间可以传输数据,exchange()方法具有阻塞特色,此方法调用后,等待其他线程来取得数据,如果没有其他线程取得数据,则一直阻塞等待,exchange(V x, long timeout, TimeUnit unit) 设置超时时间 测试代码: public class TestThreadA extends Thread{     private Exchan...

qinxiaojian1028的博客 305

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java并发编程之Exchanger

Java并发编程之Exchanger Exchanger简介: Exchanger类是JDK5中的一个并发工具辅助类,这个类的主要作用是在两个线程之间进行数据交换,它的作用是找到一个同步点,当两个线程都执行到了同步点(exchange方法)之后(有一个没有执行到就一直等待,也可以设置等待超时时间),就将自身线程的数据与对方交换,可简单地将Exchanger对象理解为一个包含两个格子的容器,通过exchanger方法可以向两个格子中填充信息。当两个格子中的均被填充时,该对象会自动将两个格子的信息交换,然后返回

zdl_csdn的博客 306

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java并发工具类(三)Exchanger

Java并发工具类(三)Exchanger 在J.U.C并发包中提供了一些工具类,可以供我们在日常的开发中,根据不同的情况去进行一些相关的并发控制,具体的类有: CountDownLatch Semaphore Exchanger CyclicBarrier Exchanger 概念 Exchanger是线程间协作的工具类,Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同...

java界的小学生 909

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java并发基础:Exchanger全面解析!

Exchanger类的优点在于能够简洁高效地实现两个线程间的数据交换,通过Exchanger,开发者可以避免复杂的锁和同步机制,降低并发编程的难度,同时,它还提供了线程安全的数据交换保障,使得多线程协作更为可靠、易用性和高效性。

科技互联网领域深度探索者,乐于分享与写作。 1562

掌握 Java 的并发编程:Exchanger 工具类

Exchanger 是 Java 并发包中实现线程间数据交换的重要工具,其核心价值在于简化两个线程的协作逻辑,通过阻塞式交换实现数据同步。在实际开发中,合理使用 Exchanger 可以优化需要两两协作的场景(如任务分治、状态同步),但需注意线程安全、阻塞处理及性能优化。结合 CyclicBarrier、CountDownLatch 等其他并发工具,可进一步构建灵活高效的多线程系统。

潜意识Java的博客 925

java并发工具之Exchanger

一.介绍 Exchanger(交换者),是用于线程间协作的工具类,Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据,这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。 二...

猿上生活 478

Java并发核心-exchanger

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34111790的博客 98

Java并发多线程编程——并发工具类Exchanger

目录一、Exchanger的理解二、Exchanger类中常用方法三、Exchanger类的使用示例 一、Exchanger的理解 Exchanger 属于java.util.concurrent包; Exchanger 是 JDK 1.5 开始提供的一个用于两个工作线程之间交换数据的封装工具类; 一个线程在完成一定的事务后想与另一个线程交换数据,则第一个先拿出数据的线程会一直等待第二个线程,直到第二个线程拿着数据到来时才能彼此交换对应数据。 二、Exchanger类中常用方法 public Exc

小志的博客 546

深入剖析Java并发库:Exchanger的工作原理与应用场景

Exchanger是一个用于线程间数据交换的同步点。它允许两个线程在一个点上交换彼此的数据。每个线程在调用exchange方法时提供一个对象,然后等待另一个线程到达该点进行交换。一旦两个线程都到达交换点,它们就可以安全地交换数据并继续执行。Exchanger是Java并发库中的一个强大且有用的工具类。它提供了一种简单而高效的方式来实现线程间的数据交换和同步。通过深入理解其工作原理和应用场景,我们可以更好地利用它来编写高效且可靠的并发程序。个人主页。

码到三十五 1万+

Java 并发编程—— Exchanger 应用

null && // 如果当前slot值不为null,且值y没改变,则将当前slot片段设置为null。else if (y == null && // 如果当前slot存储的值为null,并且通过CAS操作赋值me成功。if (m > (index >>>= 1)) // 当前位置不为0,则index/2不停缩小,直至找到交换值。// 如果当前index==0,则加入等待队列,等待与别人交换,即下标为0的位置始终是等待别人来交换的位置。

2401_85117728的博客 1052

Java并发之Exchanger类

应用场景如果两个线程在运行过程中需要交换彼此的信息,可以使用Exchanger这个类。 Exchanger为线程交换信息提供了非常方便的途径,它可以作为两个线程交换对象的同步点,只有当每个线程都在进入 exchange ()方法并给出对象时,才能接受其他线程返回时给出的对象。使用方法Exchanger的构造方法如下: Exchanger(); //创建一个新的 Exchanger。 Exch

渐入佳境Coder 365

Java并发之Exchanger

package com.leasehouse; import java.util.concurrent.Exchanger; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestExchanger { static ExchangerSt

fycghy0803的专栏 297

Java 并发 --- Exchanger源码分析

Exchanger 是一个用于线程间协作的工具类,Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange 方法交换数据,如果第一个线程先执行exchange 方法,它会一直等待第二个线程也执行exchange 方法,当两个线程都到达同步点时,这两个线程就可以交换数据。

小张的专栏 3174
上一篇: java并发-Semaphore
下一篇: 初识Kubernetes
曲终--人散
博客等级 码龄14年 23粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值