JAVA之Exchanger
如果两个线程在运行过程中需要交换彼此的信息,比如一个数据或者使用的空间,就需要用到Exchanger这个类,Exchanger为线程交换信息提供了非常方便的途径,它可以作为两个线程交换对象的同步点,只有当每个线程都在进入 exchange ()方法并给出对象时,才能接受其他线程返回时给出的对象。
Exchanger的构造方法如下:
[java]
Exchanger(); //创建一个新的 Exchanger。
Exchanger用到的主要方法有:
[java]
exchange(V x); //等待另一个线程到达此交换点(除非它被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
exchange(V x, long timeout, TimeUnit unit); // 等待另一个线程到达此交换点(除非它被中断,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。
下面是demo代码:
package com.xt.thinks21_7; import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Exchanger;
import java.util.concurrent.TimeUnit; public class ThreadLocalTest { public static void main(String[] args) {
Exchanger<List<Integer>> exchanger = new Exchanger<List<Integer>>();
new Thread1(exchanger).start();
new Thread2(exchanger).start();
} } class Thread1 extends Thread {
List<Integer> list = new ArrayList<Integer>();
Exchanger<List<Integer>> exchanger = null; public Thread1(Exchanger<List<Integer>> exchanger) {
this.exchanger = exchanger;
} @Override
public void run() {
Random rand = new Random();
list.add(rand.nextInt(10000));
list.add(rand.nextInt(10000));
list.add(rand.nextInt(10000));
list.add(rand.nextInt(10000));
list.add(rand.nextInt(10000));
System.out.println("\nThread1:list-->" + list.size() + "\n" + list);
for (int i = 0; i < 10; i++) {
try {
list = exchanger.exchange(list);
System.out.println("\nThread1:sizeoflist-->" + list.size()
+ "\n" + list);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} class Thread2 extends Thread {
List<Integer> list = new ArrayList<Integer>();
Exchanger<List<Integer>> exchanger = null; public Thread2(Exchanger<List<Integer>> exchanger) {
this.exchanger = exchanger;
} @Override
public void run() {
try {
TimeUnit.MILLISECONDS.sleep(10);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
Random rand = new Random();
list.add(rand.nextInt(10000));
list.add(rand.nextInt(10000));
list.add(rand.nextInt(10000));
list.add(rand.nextInt(10000));
list.add(rand.nextInt(10000));
System.out.println("\nThread2:list-->" + list.size() + "\n" + list);
for (int i = 0; i < 10; i++) {
try {
list = exchanger.exchange(list);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("\nThread2:sizeoflist-->" + list.size() + "\n"
+ list);
}
}
}
输出结果:
Thread1:list-->5
[5943, 3873, 5422, 2297, 3070]
Thread2:list-->5
[2774, 3676, 2137, 1446, 9944]
Thread2:sizeoflist-->5
[5943, 3873, 5422, 2297, 3070]
Thread1:sizeoflist-->5
[2774, 3676, 2137, 1446, 9944]
Thread2:sizeoflist-->5
[2774, 3676, 2137, 1446, 9944]
Thread1:sizeoflist-->5
[5943, 3873, 5422, 2297, 3070]
Thread1:sizeoflist-->5
[2774, 3676, 2137, 1446, 9944]
Thread2:sizeoflist-->5
[5943, 3873, 5422, 2297, 3070]
Thread2:sizeoflist-->5
[2774, 3676, 2137, 1446, 9944]
Thread1:sizeoflist-->5
[5943, 3873, 5422, 2297, 3070]
Thread2:sizeoflist-->5
[5943, 3873, 5422, 2297, 3070]
Thread1:sizeoflist-->5
[2774, 3676, 2137, 1446, 9944]
Thread1:sizeoflist-->5
[5943, 3873, 5422, 2297, 3070]
Thread2:sizeoflist-->5
[2774, 3676, 2137, 1446, 9944]
Thread2:sizeoflist-->5
[5943, 3873, 5422, 2297, 3070]
Thread1:sizeoflist-->5
[2774, 3676, 2137, 1446, 9944]
Thread1:sizeoflist-->5
[5943, 3873, 5422, 2297, 3070]
Thread2:sizeoflist-->5
[2774, 3676, 2137, 1446, 9944]
Thread2:sizeoflist-->5
[5943, 3873, 5422, 2297, 3070]
Thread1:sizeoflist-->5
[2774, 3676, 2137, 1446, 9944]
Thread1:sizeoflist-->5
[5943, 3873, 5422, 2297, 3070]
Thread2:sizeoflist-->5
[2774, 3676, 2137, 1446, 9944]
从输出结果中可以看出两个线程互相交换数据,直到循环结束。
JAVA之Exchanger的更多相关文章
- Java线程--Exchanger使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11868576.html Java线程--Exchanger使用: Exchanger 是用来交 ...
- java并发Exchanger的使用
目录 简介 类定义 类继承 构造函数 两个主要方法 具体的例子 结语 简介 Exchanger是java 5引入的并发类,Exchanger顾名思义就是用来做交换的.这里主要是两个线程之间交换持有的对 ...
- java多线程-Exchanger
简介: 可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给exchange方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchanger 可能被视为Synchr ...
- java多线程编码注意事项
Sole purpose of using concurrency is to produce scalable and faster program. But always remember, sp ...
- dubbo开发者指南
开发者指南 参与 流程 任务 版本管理 源码构建 框架设计 整体设计 模块分包 依赖关系 调用链 暴露服务时序 引用服务时序 领域模型 基本原则 扩展点加载 扩展点配置 扩展点自动包装 扩展点自动装配 ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
- 【Java并发编程实战】-----“J.U.C”:Exchanger
前面介绍了三个同步辅助类:CyclicBarrier.Barrier.Phaser,这篇博客介绍最后一个:Exchanger.JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点. ...
- Java多线程20:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger
前言 在多线程环境下,JDK给开发者提供了许多的组件供用户使用(主要在java.util.concurrent下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码.之前讲 ...
- Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger
本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是Coun ...
随机推荐
- Photoshop CS6 基础知识
Photoshop CS6 基础知识 新建 练习 宽度72, 像素厘米 ...
- .NET自动更新
asp.net b/s就是布置在服务器的.你这个是要单机版的更新机制,博客园里面好几篇文章说这事呢. http://www.cnblogs.com/cnsharp/archive/2013/04/11 ...
- HDU 1039 -Easier Done Than Said?
水水的 #include <iostream> #include <cstring> using namespace std; ]; bool flag; int vol,v2 ...
- 启动程序的c++方法
#include <Windows.h> void main() { WinExec( "notepad.exe fitdata.txt", SW_SHOW ); // ...
- xshell4无法使用小键盘问题解决
今天新安装了一个Xshell4.0的客户端,登录linux服务器发现无法使用小键盘进行输入,后来把终端里的——终端类型 更改成linux后重新打开标签登录服务器,发现可正常使用.默认的终端类型为:xt ...
- spring+hibernate
添加注解时spring是添加在set方法上而hibernate是添加在get方法上 事务应该加在service层上,而不是加在dao层上,如果加在dao层上回滚的时候只能回滚一个dao的实现. 事务处 ...
- MVC 返回ActionResult 类型
1. Content() 返回文本类型,比如"Hello World!". 2.File() 返回文件类型,如PDF,JPG. 3.HttpNotFound() 返回404 HTT ...
- 谈谈ILDasm的功能限制与解除
原文:谈谈ILDasm的功能限制与解除 首先,我在此申明,此文并不是教别人突破限制,我们只是用学习的眼光看问题 大家都知道ILDasm是.NET程序的反编译工具,它是由Microsoft提供的反编译工 ...
- 如何修改被编译后DLL文件
原文 http://www.cnblogs.com/wujy/p/3275855.html 我们平时在工作中经常会遇到一些已经被编译后的DLL,而且更加麻烦是没有源代码可以进行修改,只能针对这个DLL ...
- 宣布正式发布 Windows Azure 移动服务、网站及持续的服务创新
我们努力创新,向开发人员提供多样化平台以构建最好的云应用程序并在第一时间提供给世界各地的客户.许多新应用程序都属于"现代化应用程序",即始终基于 Web,且可以通过各种移动设备进行 ...