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

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

 1 package cn.sp.test4;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 import java.util.concurrent.Exchanger;
 6
 7 /**
 8  * Created by 2YSP on 2017/9/1.
 9  * 两个线程之间交换数据
10  */
11 public class ExchangerTest {
12
13
14     public static void main(String[] args) {
15         final Exchanger<List<Integer>> exchanger = new Exchanger<>();
16
17         new Thread(() -> {
18             List<Integer> l = new ArrayList<Integer>(2);
19             l.add(1);
20             l.add(2);
21             try {
22                 l = exchanger.exchange(l);
23             } catch (InterruptedException e) {
24                 e.printStackTrace();
25             }
26             System.out.println("thread1: " + l);
27         }).start();
28
29         new Thread(() -> {
30             List<Integer> l = new ArrayList<Integer>(2);
31             l.add(3);
32             l.add(4);
33             try {
34                 l = exchanger.exchange(l);
35             } catch (InterruptedException e) {
36                 e.printStackTrace();
37             }
38             System.out.println("thread2: " + l);
39         }).start();
40
41     }
42 }

执行结果:

可以看到线程1和2已经交换了数据。

转载于:https://www.cnblogs.com/2YSP/p/7483584.html

concurrent包下的Exchanger练习相关推荐

  1. java concurrent 框架,java.util.concurrent 包下的 Synchronizer 框架

    看完书 java concurrency in practice 当然是想找点啥好玩的东东玩玩. 当看到了Doug Lee 的论文 << The java.util.concurrent ...

  2. [Jdk源码学习]聊聊concurrent包下面的volite*

    引子:关于Java并发中的volatile关键字 并切--定义 悲观锁: 1.一个线程在执行一个操作时持有对一个资源的独占锁(A线程占了资源a,则其他线程就不能操作资源a) 2.一般用在冲突比较可能发 ...

  3. Concurrent包下的常用并发类和普通类之间的区别

    1. ConcurrentHashMap和HashMap以及Hashtable之间的区别 1.1 HashMap不是线程安全的,key和value都可为null:而Hashtable是线程安全的,代码 ...

  4. Java工具包工具类,java.util.concurrent 包下工具类的使用

    CountDownLacth 的使用 常用于监听某些初始化操作,等初始化执行完毕,通知主线程继续执行. 先看示例代码: public class UseCountDownLatch { public ...

  5. concurrent包下线程池类小结

    并发包下的线程池技术虽然常用,但是知识点较多易忘.所以,参考网络资源做了一个小结,便于复习. 1.Executor接口 用于执行已提交的Runnable任务. Paste_Image.png 2.Ex ...

  6. java.util 常见_Java基础知识-java.util.concurrent包下常见类的使用

    一,Condition 一个场景,两个线程数数,同时启动两个线程,线程A数1.2.3,然后线程B数4.5.6,最后线程A数7.8.9,程序结束,这涉及到线程之间的通信. public classCon ...

  7. 多线程十 JUC包下的常用工具类

    JUC包下的常用工具类 1. CountDownLatch-闭锁 2. CyclicBarrier-循环栅栏 3. Semaphore-信号量 4. Exchanger-线程数据交换器 这篇文章主要是 ...

  8. Java - concurrent包详解

    我们都知道,在JDK1.5之前,Java中要进行业务并发时,通常需要有程序员独立完成代码实现,当然也有一些开源的框架提供了这些功能,但是这些依然没有JDK自带的功能使用起来方便.而当针对高质量Java ...

  9. 模特赛马java课程设计_Thinking in Java---Concurrent包下的新构件学习+赛马游戏仿真...

    Java5的java.util.concurrent包下引入了大量的用于解决并发问题的新类:相对于前面那些基础的线程同步和通信的方法,这些新类是一种更高层次上的抽象,使用起来还是比较容易的.这篇博客就 ...

最新文章

  1. vue中点击第一次没有触发按钮怎么操作_vue如何触发某个元素的单击事件?
  2. 机器学习和洗衣机的关系?
  3. [ZJOI 2010]count 数字计数
  4. PostgreSQL在何处处理 sql查询之五十一
  5. 【PAT甲级 多项式相乘】1009 Product of Polynomials (25 分) C++ 全部AC
  6. Linux 自带的LED 灯驱动实验
  7. Linux下日志分析的几个常用命令
  8. android view过度动画,为View的切换添加过渡动画
  9. 漫步最优化十六——优化的一般问题
  10. 电力物联网智慧路灯充电桩传感器技术应用方案
  11. 某车企笔试题解答(1)
  12. linux服务器运行dyna,dynamips分布式实现详解
  13. Hookswork多帐户跨平台MT4跟单软件的十二大优势:
  14. 我们为什么存在于三维空间而不是四维空间
  15. 芯片烧录器编程AT24C02
  16. 【数据库基础】01_数据库概述与MySQL语法基础
  17. 【java后端】容器集合
  18. 通过python调用OpenAI的API
  19. 315再曝数据安全问题,短信钓鱼、App窃密等成焦点
  20. 刚出的!2019中囯城市实力大排名!看完惊到了!

热门文章

  1. jpg无损压缩 java_使用FreeImage对JPEG进行无损优化
  2. linux setuid函数_setuid函数解析
  3. 安卓总线传输协议常用关键词
  4. 树莓派怎么学linux,树莓派使用入门用树莓派学 Linux
  5. 合并两个有序数组 java_合并两个有序的数组
  6. java list 占用内存不释放_性能不打折,内存占用减少90%,Facebook提出极致模型压缩方法Quant-Noise...
  7. k8s pod里访问不到外部ip_K8S容器网络如何实现通信?
  8. python中format函数用法简书_增强的格式化字符串format函数
  9. go 生成hash_go基础之map-写在前面(一)
  10. java窗体线条切换消失_java – 如何更改apache poi生成的图表不使用平滑线条并将空单元格显示为间隙?...