Exchanger可以在两个线程之间交换数据,只能是2个线程,他不支持更多的线程之间互换数据。

当线程A调用Exchange对象的exchange()方法后,他会陷入阻塞状态,直到线程B也调用了exchange()方法,然后以线程安全的方式交换数据,之后线程A和B继续运行

public class ThreadLocalTest {public static void main(String[] args) {Exchanger<List<Integer>> exchanger = new Exchanger<>();new Consumer(exchanger).start();new Producer(exchanger).start();}}class Producer extends Thread {List<Integer> list = new ArrayList<>();Exchanger<List<Integer>> exchanger = null;public Producer(Exchanger<List<Integer>> exchanger) {super();this.exchanger = exchanger;}@Overridepublic void run() {Random rand = new Random();for(int i=0; i<10; i++) {list.clear();list.add(rand.nextInt(10000));list.add(rand.nextInt(10000));list.add(rand.nextInt(10000));list.add(rand.nextInt(10000));list.add(rand.nextInt(10000));try {list = exchanger.exchange(list);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}class Consumer extends Thread {List<Integer> list = new ArrayList<>();Exchanger<List<Integer>> exchanger = null;public Consumer(Exchanger<List<Integer>> exchanger) {super();this.exchanger = exchanger;}@Overridepublic void run() {for(int i=0; i<10; i++) {try {list = exchanger.exchange(list);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.print(list.get(0)+", ");System.out.print(list.get(1)+", ");System.out.print(list.get(2)+", ");System.out.print(list.get(3)+", ");System.out.println(list.get(4)+", ");}}
}

Java线程之Exchanger相关推荐

  1. Java多线程之Exchanger

    import java.util.concurrent.Exchanger;/*** Exchanger让两个线程可以互换信息.* 例子中服务生线程往空的杯子里倒水,顾客线程从装满水的杯子里喝水,* ...

  2. exchanger java_(十二)java多线程之Exchanger

    引言 今天我们讲最后一个同步工具类Exchanger,这个比较简单,就是让两个线程交换数据. 理论 Exchanger只有两个方法而已,而且两个还是一样的,只是参数不通而已 exchange(V x) ...

  3. java线程之InheritableThreadLocal

    ThreadLocal和InheritableThreadLocal区别,可以用代码测试一下: [java] view plain copy package com.lang; import juni ...

  4. Java线程之Synchronized用法

    synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对 ...

  5. (JAVA)线程之lock和死锁(例)

    package thread; import java.util.concurrent.locks.*;/*** @author Alina* @date 2021年12月20日 11:07 下午* ...

  6. C++/Java线程之分

    JAVA线程状态图 1.C++/windows中主线程结束,其他线程必然死亡(即使调用pthread_detach解除父子关系,主线程消亡时也会导致子线程被迫关闭). ----1.1 一个进程中可以有 ...

  7. Java线程之CompletionService批处理任务

    如果你向Executor提交了一个批处理任务,并且希望在它们完成后获得结果,怎么办呢? 为此你可以保存与每个任务相关联的Future,然后不断地调用 timeout为零的get,来检验Future是否 ...

  8. Java线程之CompletionService

    当使用ExecutorService启动了多个Callable后,每个Callable会产生一个Future,我们需要将多个Future存入一个线性表,用于之后处理数据.当然,还有更复杂的情况,有5个 ...

  9. Java线程之setDaemon(true)方法的作用

    一.线程 JAVA线程分为即实线程与守护线程,守护线程是优先级低,存活与否不影响JVM的退出的线程,实现守护线程的方法是在线程start()之前setDaemon(true),否则会抛出一个Illeg ...

最新文章

  1. linux服务器多网卡bond
  2. 后台参数验证的几种方式
  3. Oracle的分区操持
  4. Java调用JavaScript
  5. 【线性规划和网络流24题】
  6. 去除 计算机里面的百度云管家,WIN7如何彻底清除“百度云管家”图标或残留文件?...
  7. 如何找出Fiori launchpad URL start_up请求发起的具体位置
  8. 有没有一段代码,让你觉得人类的智慧也可以璀璨无比?【转】
  9. .NET6之MiniAPI(十七):缓存
  10. netflix测试能不能看_Netflix监管者测试–引入知事,准官员
  11. 一家典型的云原生企业,如何在创业早期数次“弯道超车”?
  12. L1-073 人与神 (5 分)-PAT 团体程序设计天梯赛 GPLT
  13. kubernetes Pod yaml解析注释
  14. 正则表达式-2-正则表达式实战1
  15. C语言 case语句 连续值,对一个switch case语句使用两个值
  16. 【绝知此事要躬行】线性表之数组OJ
  17. (CVPR-2018)Non-local Neural Networks
  18. 信息与熵【上】生命以信息为食
  19. 一场“测谎”人机对战背后的故事:度小满的技术进击之路
  20. 【刷爆LeetCode】七月算法集训(14)栈

热门文章

  1. 中国SCR脱硝催化剂行业竞争现状分析与未来需求预测报告2022-2028年
  2. PLC的顺控继电器(SCR编程)总结
  3. 业务消息中心系统设计与实现(一)
  4. 无心剑七绝147首[1994年~2021年]
  5. jeecg-boot自动生成代码_PSIM 仿真:如何使用 PSIM12 自动生成代码
  6. 云基础架构安全_这是使您的云基础架构稳定,安全和可扩展的方法。
  7. Hey UI源码市场
  8. SQLServer 查询分析器里大小写转换快捷键
  9. mac book 华为C8815不能debug
  10. windows编写linux脚本,适用于 Windows 和 Linux 的脚本编写工具包