import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/*
* Exchanger: 两个线程 间 交换 数据
* exchange() 等待另一个线程到达此交换点(除非当前线程被中断),
* 然后将给定的对象传送给该线程,并接收该线程传来的对象。
* 即: 当线程为单数条时,那么总有条线程是交换不到数据的,该线程一直等待。。
*
* 设计 一个小游戏:相亲随机配对
*/
public class ExchangerTest {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final Exchanger<String> exchanger = new Exchanger<String>();
final List<String> males = new ArrayList<String>();
males.add("张三");
males.add("李四");
males.add("王五");males.add("赵六");males.add("卓七");
final List<String> females = new ArrayList<String>();
females.add("张晓");
females.add("李丽");
females.add("王梅");females.add("赵雅");females.add("卓红");
final Random random = new Random();
final int nums = 5;
Runnable r1 = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < nums; i++) {
final int j = random.nextInt(nums - i);
try {
String data1 = males.get(j);
System.out.println(Thread.currentThread().getName()
+ "正在把 :'" + data1 + "'提出速配");
Thread.sleep((long) (Math.random() * 1000));
String data2 = exchanger.exchange(data1);
System.out.println(Thread.currentThread().getName()
+ "速配成功:'" + data1 + "'----" + "'" + data2+ "'");
males.remove(j);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
service.execute(r1);
Runnable r2 = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < nums; i++) {
final int j = random.nextInt(nums - i);
try {
String data1 = females.get(j);
System.out.println(Thread.currentThread().getName()
+ "正在把 :'" + data1 + "'提出速配");
Thread.sleep((long) (Math.random() * 1000));
String data2 = exchanger.exchange(data1);
/* System.out.println(Thread.currentThread().getName()
+ "速配成功:'" + data1 + "'----" + "'" + data2+ "'");*/
females.remove(j);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
service.execute(r2);
service.shutdown();
}
}
分享到:
相关推荐
java.util.concurrent包中的Exchanger类可用于两个线程之间交换信息。可简单地将Exchanger对象理解为一个包含两个格子的容器,通过exchanger方法可以向两个格子中填充信息。当两个格子中的均被填充时,该对象会自动...
流量交换软件,适用于所有基于surfow流量交换的网站(php脚本)
这里主要是两个线程之间交换持有的对象。当Exchanger在一个线程中调用exchange方法之后,会等待另外的线程调用同样的exchange方法。 两个线程都调用exchange方法之后,传入的参数就会交换。 类定义 public class ...
此外,PriorityQueue的使用使发送和获取数据的方法成为线程安全的。 消息在“主题”上发送,每个接收者都可以根据主题名称过滤传入的数据。 通过网络发送字典(为简单起见,我们在本地主机上发送字典)是如此简单:...
热传递matlab代码热任务交换器 该代码代表COMSOL Multiphysics项目的构造函数,该结构与MATLAB环境连接以研究粗糙壁的传热过程。
主要介绍了Java多线程编程之使用Exchanger数据交换实例,本文直接给出实例代码,需要的朋友可以参考下
换货商该交换器是使用纯JavaScript Bootstrap编写的。 它有10个选择货币的选项。
KSP-Craft.io交换器 KSPCraft.io交流平台
顾名思义Exchanger让两个线程可以互换信息。用一个例子来解释比较容易。例子中服务生线程往空的杯子里倒水,顾客线程从装满水的杯子里喝水,然后通过Exchanger双方互换杯子,服务生接着往空杯子里倒水,顾客接着喝水...
(应用名称)(应用简述)由(您的名字在这里)使用的技术巴别塔引导程序网页包CSS 埃斯林特JavaScript 笑话jQuery的npm popper.js描述设置/安装要求打开本地计算机上的终端如果您的本地设备上未安装和 ,请按照的...
输入一个值并选择该值的基础货币,然后选择一个目标货币并单击“转换”。 设定与安装 要使用此应用程序,您将需要为ExchangeRate-API获取自己的API密钥。 转到网站 输入您的电子邮件地址,然后单击“获取免费密钥...
Exchanger:交换器,负责实际上数据传输 Filter:过滤器 Cluster:集群,负责做集群容错 Invoker:服务/调用方抽象 SoarContext:请求上下文 Registry:注册中心 Serializer:序列化 LoadBalancer:客户端负责均衡 ...
主要介绍了Java编程线程同步工具Exchanger的使用实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
SooGet Version 1.0 Beta5 ... ---------------------------- 1. 产品说明 SooGet是一款集客户端HTTP,FTP下载和P2P文件交换功能的软件,为用户提供了强大的下载和文件...但在一个时间内,最多允许100个线程运行。
个人元数据交换器 The C.A.B.A.L.(反对有争议的论点迷宫联盟)提出了 Personal Metadata Exchanger.@ 2021 Davide“ limaCAT” Inglima(希望)在4或5年后变成什么? 纯文本的usenet客户端-服务器组合,带有额外的...
【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...
E-NTU 方法用于解决各种换热... 输入:两种流体的温度、质量流量和比热。 换热面积和总传热系数也是常数。 不过,根据材料和壁厚对传热系数进行建模并不会太难。 输出:出口处两种流体的温度、热交换和非线性温度曲线。
Aspen Plus换热器模拟
用于FreeCAD的CAD Exchanger插件这个插件允许导入和导出到支持的所有商业CAD文件格式。描述是一种多平台(Windows,MacOS和Linux)商业付费应用程序,必须在其网站上购买(可以免费获得30天的评估)。 此附加组件...
这是一种两方栅栏,各方在栅栏位置上交换数据。 应用场景:当两方执行不对称的操作(读和取) 线程池 任务与执行策略之间的隐形耦合 线程饥饿死锁 运行时间较长的任务 设置线程池的大小 ...