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并发编程.当 ...
随机推荐
- 【apache】使用HttpClient,进行简单网页抓取
1 package com.lw.httpclient.test; 2 import org.apache.http.client.methods.CloseableHttpResponse; 3 i ...
- 23.Quick QML-简单且好看的图片浏览器-支持多个图片浏览、缩放、旋转、滑轮切换图片
之前我们已经学习了Image.Layout布局.MouseArea.Button.GroupBox.FileDialog等控件. 所以本章综合之前的每章的知识点,来做一个图片浏览器,使用的Qt版本为Q ...
- 用户对象/GDI对象/内核对象
对象的分类 Windows的对象可以分为三种,分别是用户对象,GDI对象和内核对象.系统使用用户对象支持窗口管理,使用GDI对象支持图形,并使用内核对象支持内存管理,进程执行和进程间通信(IPC) . ...
- Jekyll+GitHub Pages部署自己的静态Blog
混了这么久,一直想拥有自己的博客,通过jekyll和GitHub Pages捣腾出了自己的博客(https://www.ichochy.com) 一.安装jekyll 首先有安装Ruby的开发环境 运 ...
- [Java] 数据分析--分类
ID3算法 思路:分类算法的输入为训练集,输出为对数据进行分类的函数.ID3算法为分类函数生成分类树 需求:对水果训练集的一个维度(是否甜)进行预测 实现:决策树,熵函数,ID3,weka库 J48类 ...
- [Python] Virtualenv 使用
参考 https://www.jianshu.com/p/b6e52b80653f
- [DB] MySQL 索引分类
按数据结构 B树索引 数据位于叶子节点,到任何一个叶子节点的距离相同,一般不超过3-4层 B+树索引:每个叶子节点除了数据还存放前后叶子节点的指针,方便快速检索,是InnoDB采用的索引结构 Hash ...
- 对于uos目前只能安装商店的感慨,强制安装除外
对于uos目前只能安装商店的感慨,强制安装除外 jie1018 / 2020-5-16 21:35 浏览: 702 / 回复: 26 个人觉得,在软件不足的情况下,更应该是系统支持,而不是让用 ...
- Understanding User and Kernel Mode
https://blog.codinghorror.com/understanding-user-and-kernel-mode/ Continue Discussion92 repliesJan ' ...
- shell基础之编译安装nginx
本节新学知识:if 判断语句 1 #!/bin/bash 2 #检查环境 3 SESTATE=`getenforce` 4 if [ $SESTATE != "Disabled" ...