01 Exchanger 作用

使两个线程之间进行数据传递。(对是两个之间而不是三个或者更多个线程之间)

02 常用方法

exchange() 阻塞当前线程并等待其他线程来取得数据,若没有其他线程来取数据则一直等待。

exchange() 传递数据

exchange(V v, long timeout, TimeUnit unit) 在指定的时间内没收到消息,则抛出超时的异常。

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

Exchanger的应用场景

Exchanger可以用于遗传算法,遗传算法里需要选出两个人作为交配对象,这时候会交换两人的数据,并使用交叉规则得出2个交配结果。
Exchanger也可以用于校对工作。比如我们需要将纸制银流通过人工的方式录入成电子银行流水,为了避免错误,采用AB岗两人进行录入,录入到Excel之后,系统需要加载这两个Excel,并对这两个Excel数据进行校对,看看是否录入的一致。代码如下:

import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** TODO 在此写上类的相关说明.<br>* @author gqltt <br>* @version 1.0.0 2021年11月29日<br>* @see * @since JDK 1.5.0*/
public class ExchangerTest {private static final Exchanger<String> exgr = new Exchanger<String>();private static ExecutorService threadPool = Executors.newFixedThreadPool(2);public static void main(String[] args) {threadPool.execute(new Runnable() {@Overridepublic void run() {try {String A = "银行流水A";// A录入银行流水数据exgr.exchange(A);} catch (InterruptedException e) {Thread.interrupted();}}});threadPool.execute(new Runnable() {@Overridepublic void run() {try {String B = "银行流水B";// B录入银行流水数据String A = exgr.exchange(B);System.out.println("A和B数据是否一致:" + A.equals(B) + ",A录入的是:"+ A + ",B录入是:" + B);} catch (InterruptedException e) {Thread.interrupted();}}});threadPool.shutdown();}
}

Exchanger及其用法相关推荐

  1. java线程并发库之--线程同步工具Exchanger的使用

    Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据.今天我们就通过实例来学习一下Exchanger的用法. Exchanger的简单实例 Exchanger是 ...

  2. 想到Exchanger N parties的一种用法

    一般来说,Exchanger都是一个Consumer,一个producer,在适当的时候互相交换,这样可以避免锁. 我想到Exchanger N parties的一种用法.如下: 最初N个都是prod ...

  3. Exchanger用法详解

    Exchanger用法详解 Exchanger适用场景 Exchanger用于线程之间交换数据,其使用代码很简单,主要是使用是一个exchange()方法. 一个简单的例子如下 Exchanger&l ...

  4. Java多线程(八)之Semaphore、CountDownLatch、CyclicBarrier、Exchanger

    一.引言 Semaphore               :一个计数信号量 CountDownLatch          :一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线 ...

  5. 并发工具类(四)线程间的交换数据 Exchanger

    前言   JDK中为了处理线程之间的同步问题,除了提供锁机制之外,还提供了几个非常有用的并发工具类:CountDownLatch.CyclicBarrier.Semphore.Exchanger.Ph ...

  6. java线程中Exchanger使用

    有时我们须要对元素进行配对和交换线程的同步点,使用exchange方法 返回其伙伴的对象,这时我们就须要使用线程类中的Exchanger类了, 我通过一个实例 来简单说明一下他的用法及其作用: imp ...

  7. JCU-线程栅栏CountDowLatch与CyclicBarrier,Exchanger

    CountDowLatch 用法 (1) CountDowLatch 用来同步一个或多个线程, 强制这些线程等待由其它线程执行的一组操作完成 (2) 可以向 CountDowLatch 设置一个初始计 ...

  8. 并发编程之Exchanger原理与使用

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 在JUC包中,除了一些常用的或 ...

  9. java exchanger_java线程中Exchanger使用

    有时我们须要对元素进行配对和交换线程的同步点,使用exchange方法 返回其伙伴的对象,这时我们就须要使用线程类中的Exchanger类了, 我通过一个实例 来简单说明一下他的用法及其作用: imp ...

最新文章

  1. Memcached的定义及用法
  2. 带你走进Kaggle Kernels(内附视频讲解)
  3. 为Pdf批量添加水印
  4. Python开发【第三篇】:Python基本数据类型
  5. 05丨深入浅出索引(下)
  6. 【旅行】——出发!露营去。
  7. extends 抽象方法_关于abstract抽象类的理解
  8. [Alpha]Scrum Meeting#5
  9. Django链接Mysql 8.0 出现错误(1045:Access denied for user ‘root‘@‘localhost‘ (using password: NO) 的一种解决方法
  10. Bailian2795 金银岛【背包+贪心】
  11. keras cnn注意力机制_2019 SSA-CNN(自注意力机制)目标检测算法论文阅读笔记
  12. webgl渲染Yuv420P图像
  13. AUTOCAD——样条曲线命令
  14. 景观专业设计师必备SketchUp插件合集,你都用过吗?
  15. 网络共享计算机权限访问,访问共享计算机的时候提示没有权限使用网络资源的解决方法...
  16. shell编写三角函数_VB中三角函数计算.doc
  17. 怎么有python画五角星_Python的画五角星
  18. linux连接小米路由器ssh,【Linux】小米路由开启SSH访问权限
  19. 贵阳骑龙村:一根小香葱闯出大市场
  20. SQL 语句中 where 条件后 写上 1=1 是什么意思!

热门文章

  1. 观点 | 抛开炒作看知识图谱,为什么现在才爆发?
  2. 看完这篇Linux基本的操作就会了
  3. Android官方开发文档Training系列课程中文版:添加ActionBar之ActionBar浮层效果
  4. 简单的循环以及从接口获取数组对象的一个字段集合
  5. 欧几里得算法及其扩展
  6. Codeforces 138C(区间更新+离散化)
  7. POJ 3928 amp; HDU 2492 Ping pong(树阵评价倒数)
  8. iOS一次定位解决方案(基于高德iOS SDK)
  9. C++ Primer 第11章 习题11.16
  10. eclipse中下载spring-tool-suite插件遇到的问题