java并发编程JUC第十一篇:如何在线程之间进行对等数据交换

java.util.concurrent.Exchanger可以用来进行数据交换,或者被称为“数据交换器”。两个线程可以使用Exchanger交换数据,下图用来说明Exchanger的作用

在下面的代码中
- 首先我们定义了一个Exchanger,用于数据交换
- 然后定义了两个线程对象bookExchanger1和bookExchanger2,两个线程都持有Exchanger交换器对象用于数据交换
- 两个线程中的每个线程都有自己的数据,比如下面代码中的String[] 书籍数组。
public static void main(String[] args) {
//数据交换器-数据为book
Exchanger<String> exchanger = new Exchanger<>();
//换书线程1
BookExchanger bookExchanger1
= new BookExchanger(exchanger, new String[]{"Java从入门到放弃","Java编程思想"});
//换书线程2
BookExchanger bookExchanger2
= new BookExchanger(exchanger, new String[]{"C语言程序设计","实战Python数据分析"});
new Thread(bookExchanger1).start();
new Thread(bookExchanger2).start();
}
BookExchanger 继承自Runnable代表参与换书的换书读者,他持有Exchanger数据交换器用于交换图书。
public class BookExchanger implements Runnable{
Exchanger<String> exchanger = null; //数据交换器
String[] books = null; //图书数组
public BookExchanger(Exchanger<String> exchanger, String[] books) {
this.exchanger = exchanger;
this.books = books;
}
@Override
public void run() {
try {
for(String bookName : books) {
//交换数据,bookName为我的书,exBook为我换回来的书
String exBook = this.exchanger.exchange(bookName);
System.out.println(
Thread.currentThread().getName() +
" 用《 " + bookName + "》 换 《 " + exBook + "》"
);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
执行上文中的代码,得到如下的打印输出。可以看到只有两个线程完成一次交换之后,才能再进行下一次的交换。
Thread-1 用《 C语言程序设计》 换 《 Java从入门到放弃》
Thread-0 用《 Java从入门到放弃》 换 《 C语言程序设计》
Thread-1 用《 实战Python数据分析》 换 《 Java编程思想》
Thread-0 用《 Java编程思想》 换 《 实战Python数据分析》
欢迎关注我的博客,里面有很多精品合集
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
觉得对您有帮助的话,帮我点赞、分享!您的支持是我不竭的创作动力! 。另外,笔者最近一段时间输出了如下的精品内容,期待您的关注。
- 《手摸手教你学Spring Boot2.0》
- 《Spring Security-JWT-OAuth2一本通》
- 《实战前后端分离RBAC权限管理系统》
- 《实战SpringCloud微服务从青铜到王者》
- 《VUE深入浅出系列》
java并发编程JUC第十一篇:如何在线程之间进行对等数据交换的更多相关文章
- java并发编程JUC第十篇:CyclicBarrier线程同步
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...
- java并发编程笔记(十一)——高并发处理思路和手段
java并发编程笔记(十一)--高并发处理思路和手段 扩容 垂直扩容(纵向扩展):提高系统部件能力 水平扩容(横向扩容):增加更多系统成员来实现 缓存 缓存特征 命中率:命中数/(命中数+没有命中数) ...
- java并发编程JUC第九篇:CountDownLatch线程同步
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...
- Java并发编程实战.笔记十一(非阻塞同步机制)
关于非阻塞算法CAS. 比较并交换CAS:CAS包含了3个操作数---需要读写的内存位置V,进行比较的值A和拟写入的新值B.当且仅当V的值等于A时,CAS才会通过原子的方式用新值B来更新V的值,否则不 ...
- Java 并发编程(四):如何保证对象的线程安全性
01.前言 先让我吐一句肺腑之言吧,不说出来会憋出内伤的.<Java 并发编程实战>这本书太特么枯燥了,尽管它被奉为并发编程当中的经典之作,但我还是忍不住.因为第四章"对象的组合 ...
- [Java 并发] Java并发编程实践 思维导图 - 第二章 线程安全性
依据<Java并发编程实践>一书整理的思维导图.
- Java并发编程原理与实战八:产生线程安全性问题原因(javap字节码分析)
前面我们说到多线程带来的风险,其中一个很重要的就是安全性,因为其重要性因此,放到本章来进行讲解,那么线程安全性问题产生的原因,我们这节将从底层字节码来进行分析. 一.问题引出 先看一段代码 packa ...
- Java并发编程原理与实战五:创建线程的多种方式
一.继承Thread类 public class Demo1 extends Thread { public Demo1(String name) { super(name); } @Override ...
- Java并发编程(一):进程和线程之由来
转自:http://www.cnblogs.com/dolphin0520/p/3910667.html 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当 ...
随机推荐
- JavaWeb——MySQL约束
内容索引 1. DQL:查询语句 1. 排序查询 2. 聚合函数 3. 分组查询 4. 分页查询 2. 约束 3. 多表之间的关系 4. 范式 5. 数据库的备份和还原 DQL:查询语句 1. 排序查 ...
- 用scanf_s判断输入数据是否合法
用scanf_s判断输入数据是否合法 对用户输入的整数进行求和.当用户输入任意字符时,结束程序并打印结果. A. 用户可以输入整数和浮点数 B. 用户可以在同一行输入多个数字,数字之间可以是任意一个分 ...
- “可变的”tuple
来看一个"可变的"tuple: >>> t = ('a', 'b', ['A', 'B']) >>> t[2][0] = 'X' >> ...
- C#·对于BOM头之完全解决方案
阅文时长 | 0.46分钟 字数统计 | 798.4字符 主要内容 | 1.引言&背景 2.使用C#写入带有/不带有BOM头的文件? 3.对于读取文件时,避免BOM头造成的异常. 4.声明与参 ...
- [Java]数据分析--数据可视化
时间序列 需求:将一组字符顺序添加到时间序列中 实现:定义时间序列类TimeSeries,包含静态类Entry表示序列类中的各项,以及add,get,iterator,entry方法 TimeSeri ...
- [bug] conda:Segmentation fault (core dumped)
参考 https://www.jianshu.com/p/5e230ef8a14d
- [Windows] 屏幕截图 - FastStone Capture(FSCapture) v9.4 飞扬时空汉化绿色版(官方地址) 【清晰好用 已验证】
[Windows] 屏幕截图 - FastStone Capture(FSCapture) v9.4 飞扬时空汉化绿色版(官方地址) [复制链接] 愤怒の葡萄 电梯直达 楼主 发表于 2 ...
- 运维实战案例之“Too many open files”错误与解决方法
运维实战案例之"Too many open files"错误与解决方法 技术小甜 2017-11-16 15:02:00 浏览869 服务器 shell tomcat 脚本 o ...
- Linux基本原则
Bash特性 Shell shell(外壳),广义的shell可以理解为是用户的工作环境,在windows看来桌面就是一个shell,在linux看来终端就是shell 常见的shell有两种,一种是 ...
- mysql示例及练习2
#创建数据库并应用create database shopdb;use shopdb;#创建表customerscreate table customers(c_id int primary key ...