一、概述

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

二、示例程序

package exchanger.demo;

import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* @author boshen
* @date 2018/12/20
*/
public class ExchangerTest {
class StudentThread implements Runnable{
private String data;
private Exchanger exchanger;
StudentThread(String data, Exchanger exchanger){
this.data = data;
this.exchanger = exchanger;
}
public void run(){
try {
System.out.println(Thread.currentThread().getName()+":准备交换给对方的数据:" + data);
String newData = exchanger.exchange(data).toString();
System.out.println(Thread.currentThread().getName()+":收到对方的数据:" + newData);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public static void main(String[] args){
ExchangerTest cb = new ExchangerTest();
Exchanger exchanger = new Exchanger();
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.submit(cb.new StudentThread("张三",exchanger));
executorService.submit(cb.new StudentThread("李四",exchanger));
executorService.submit(cb.new StudentThread("王五",exchanger));
executorService.submit(cb.new StudentThread("马六",exchanger));
executorService.submit(cb.new StudentThread("赵七",exchanger));
executorService.shutdown();
}
}

执行结果:

pool--thread-:准备交换给对方的数据:李四
pool--thread-:准备交换给对方的数据:张三
pool--thread-:收到对方的数据:李四
pool--thread-:准备交换给对方的数据:王五
pool--thread-:收到对方的数据:张三
pool--thread-:准备交换给对方的数据:马六
pool--thread-:收到对方的数据:王五
pool--thread-:准备交换给对方的数据:赵七
pool--thread-:收到对方的数据:马六

从以上可知:1和2相互交换了数据,3和4交换了数据,但是5一直在等待将数据交换给对方。因为Exchanger交换数据重点是在成对的线程之间,所以5没有交换同伴。

最新文章

  1. 【学习篇:他山之石,把玉攻】jquery实现调用webservice
  2. UWP Composition API - PullToRefresh
  3. Xamarin.Forms入门学习路线
  4. CDH上执行WordCount的意外和收获
  5. 【Add binary】cpp
  6. uva247 - Calling Circles(传递闭包+DFS)
  7. XSS 复合编码 续
  8. linux安装java环境
  9. EL字符串表达式和常用功能用途拦截
  10. iOS开发打电话的功能
  11. 缺少对象 WScript 问题解决方法
  12. spring cloud 随笔记录(1)-
  13. Java集合:ArrayList的实现原理
  14. ***php进行支付宝开发中return_url和notify_url的区别分析
  15. JBPM使用方法、过程记录
  16. 如何进入/home/user/.wine
  17. maven Could not find artifact com.** 无法下载原因分析
  18. 随机生成30道四则运算-NEW
  19. C# Redis辅助类封装与简单聊天室的实现思路说明
  20. 使用python uiautomation从钉钉网页版提取公司所有联系人信息

热门文章

  1. jquery 事件委托(利用冒泡)
  2. Linux下Python2升级Python3
  3. Bootstrap 框架 day57
  4. sql:inner join,left join,right join,full join用法及区别
  5. mysql SQL 逻辑查询语句和执行顺序
  6. tomcat用虚拟目录方式发布项目
  7. OKI系列针式打印机更换色带图解教程
  8. Phong和Blinn-Phong光照模型
  9. Xstream将XML转换为javabean的问题
  10. UI设计:C4D作品案例分享