Exchanger可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger 可能被视为 SynchronousQueue 的双向形式。Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用。

构造方法摘要 

Exchanger() 创建一个新的 Exchanger。

方法摘要

CountDownLatch CyclicBarrier
V exchange(V x) 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
V exchange(V x, long timeout, TimeUnit unit) 等待另一个线程到达此交换点(除非当前线程被中断,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。

代码示例 

交换操作必须是成双成对的,如果线程是奇数操作,那么两个会交换成功,另一个会一直等待交换。

import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class ExchangerTest { public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final Exchanger<String> exchanger = new Exchanger<String>();
service.execute(new Runnable() { public void run() {
try {
String data1 = "zxx";
System.out.println("线程" + Thread.currentThread().getName()
+ "正在把数据" + data1 + "换出去");
Thread.sleep((long) Math.random() * 10000); String data2=(String) exchanger.exchange(data1);
System.out.println("线程" + Thread.currentThread().getName()
+ "换回的数据为" + data2);
} catch (Exception e) { e.printStackTrace();
}
}
}); service.execute(new Runnable() { public void run() {
try {
String data1 = "lhm";
System.out.println("线程" + Thread.currentThread().getName()
+ "正在把数据" + data1 + "换出去");
Thread.sleep((long) Math.random() * 10000); String data2=(String) exchanger.exchange(data1);
System.out.println("线程" + Thread.currentThread().getName()
+ "换回的数据为" + data2);
} catch (Exception e) { e.printStackTrace();
}
}
});
service.shutdown();
}
}

最新文章

  1. ps教程连接
  2. 防刷票机制研究和.NET HttpRequest Proxy
  3. #笔记# CSS工作流
  4. ASP.Net系列教程
  5. STL的string和wstring
  6. 通过python切换hosts文件
  7. 什么是SQL注入式攻击
  8. Dubbo远程调用服务框架原理与示例
  9. java 多线程 CountDownLatch用法
  10. 百度网盘,前几天刚从百度云改名过来,百度云这个名字给之前的百度开放云(同步盘用户比较小众)good
  11. java.lang.Class类
  12. 【一天一道LeetCode】#94. Binary Tree Inorder Traversal
  13. Chinese Mahjong UVA - 11210 (暴力+回溯递归)
  14. 拒绝回调,拥抱async await
  15. 关于MySql经典高频查询语句的整理
  16. 初学ubuntu命令
  17. 如何做出一个更好的Machine Learning预测模型【转载】
  18. 安卓——AppTheme
  19. 11:self关键字
  20. CentOS7系列--10.1CentOS7中的GNOME桌面环境

热门文章

  1. Obfuscated Gradients Give a False Sense of Security: Circumventing Defenses to Adversarial Examples
  2. Geometric GAN
  3. Google面试评分卡
  4. Shelll1-基础入门之变量
  5. NoSQL是什么(一)
  6. hdfs文件导入到hive(带资源)
  7. 【记录一个问题】libtask无法在android下编译通过
  8. unity3d,java,c#,python,rospy的socket通信测试
  9. [源码分析] Facebook如何训练超大模型 --- (3)
  10. 解决vscode下载很慢的问题