JAVA多线程提高十四:同步工具Exchanger
2024-09-08 07:23:32
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();
}
}
最新文章
- ps教程连接
- 防刷票机制研究和.NET HttpRequest Proxy
- #笔记# CSS工作流
- ASP.Net系列教程
- STL的string和wstring
- 通过python切换hosts文件
- 什么是SQL注入式攻击
- Dubbo远程调用服务框架原理与示例
- java 多线程 CountDownLatch用法
- 百度网盘,前几天刚从百度云改名过来,百度云这个名字给之前的百度开放云(同步盘用户比较小众)good
- java.lang.Class类
- 【一天一道LeetCode】#94. Binary Tree Inorder Traversal
- Chinese Mahjong UVA - 11210 (暴力+回溯递归)
- 拒绝回调,拥抱async await
- 关于MySql经典高频查询语句的整理
- 初学ubuntu命令
- 如何做出一个更好的Machine Learning预测模型【转载】
- 安卓——AppTheme
- 11:self关键字
- CentOS7系列--10.1CentOS7中的GNOME桌面环境
热门文章
- Obfuscated Gradients Give a False Sense of Security: Circumventing Defenses to Adversarial Examples
- Geometric GAN
- Google面试评分卡
- Shelll1-基础入门之变量
- NoSQL是什么(一)
- hdfs文件导入到hive(带资源)
- 【记录一个问题】libtask无法在android下编译通过
- unity3d,java,c#,python,rospy的socket通信测试
- [源码分析] Facebook如何训练超大模型 --- (3)
- 解决vscode下载很慢的问题