如果两个线程在运行过程中需要交换彼此的信息,比如一个数据或者使用的空间,就需要用到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的更多相关文章

  1. Java线程--Exchanger使用

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11868576.html Java线程--Exchanger使用: Exchanger 是用来交 ...

  2. java并发Exchanger的使用

    目录 简介 类定义 类继承 构造函数 两个主要方法 具体的例子 结语 简介 Exchanger是java 5引入的并发类,Exchanger顾名思义就是用来做交换的.这里主要是两个线程之间交换持有的对 ...

  3. java多线程-Exchanger

    简介: 可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给exchange方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchanger 可能被视为Synchr ...

  4. java多线程编码注意事项

    Sole purpose of using concurrency is to produce scalable and faster program. But always remember, sp ...

  5. dubbo开发者指南

    开发者指南 参与 流程 任务 版本管理 源码构建 框架设计 整体设计 模块分包 依赖关系 调用链 暴露服务时序 引用服务时序 领域模型 基本原则 扩展点加载 扩展点配置 扩展点自动包装 扩展点自动装配 ...

  6. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  7. 【Java并发编程实战】-----“J.U.C”:Exchanger

    前面介绍了三个同步辅助类:CyclicBarrier.Barrier.Phaser,这篇博客介绍最后一个:Exchanger.JDK API是这样介绍的:可以在对中对元素进行配对和交换的线程的同步点. ...

  8. Java多线程20:多线程下的其他组件之CountDownLatch、Semaphore、Exchanger

    前言 在多线程环境下,JDK给开发者提供了许多的组件供用户使用(主要在java.util.concurrent下),使得用户不需要再去关心在具体场景下要如何写出同时兼顾线程安全性与高效率的代码.之前讲 ...

  9. Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger

    本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是Coun ...

随机推荐

  1. jvm如何知道那些对象需要回收

    1 首先的问题是:jvm如何知道那些对象需要回收 ? 目前有两种算法 引用计数法 每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数为0 ...

  2. Transfer learning across two sentiment classes using deep learning

    用深度学习的跨情感分类的迁移学习 情感分析主要用于预测人们在自然语言中表达的思想和情感. 摘要部分:two types of sentiment:sentiment polarity and poli ...

  3. linux判断日期是否合法

    #include <time.h> #include <stdio.h> typedef enum { , } bool; bool check_date(int year, ...

  4. jchat:linux聊天程序4:客户端

    makefile: jchat: main.o login.o regist.o tcp.o gcc -w main.o login.o regist.o tcp.o -o jchat rm -f * ...

  5. CSS自学笔记(13):CSS3 2D/3D转换

    CSS3中新增了对元素进行2D和3D的转换效果,这样可以是开发人员很方便的做出视觉效果更好的网页来. 通过CSS3中属性的定义,我们可以对元素进行移动.缩放.拉伸.旋转等等,可以通过定义transfo ...

  6. VS2010 CLR20r3 devenv.exe 错误的解决--vs重启解决方案

    VS2010 CLR20r3 devenv.exe 错误的解决   最近我的vs2010经常过段时间就报CLR20r3错误的解决,出现这个异常我的vs2010就要重启,很是烦人,这么搞没法干活也. 搜 ...

  7. Delphi检测网络连接状态

    有时候,我们做一些小软件就需要检测网络连接状态,比如想给你的软件加上类似QQ那样的系统消息,可是像我这样的穷人肯定是买不起服务器了,那我们只好另想办法,可以读取网页然后用浏览器显示,这个时候就需要判断 ...

  8. 安装Logstash

    安装Logstash: Logstash 需要 Java 7或者以后版本,使用官方的Oracle发布或者一个开源发布版本比如OpenJDK 检查Java 版本,运行下面的命令: zjtest7-fro ...

  9. Windows Azure Service Bus 推动财务服务门户的高可用性和可伸缩性

    抵押贷款公司和评估管理公司面临着快速.复杂且数据量极大的业务流程.他们需要可快速.轻松设置且容量几乎无限的可伸缩的企业级服务,来对处理评估订单以及自动化流程本身所产生的所有文档和数据进行管理. 这听起 ...

  10. mysql排行榜sql的实现

    SELECT num_rows AS num_rows, openid , openid, money FROM lt_cash_user ) t ORDER BY money DESC ) t1 W ...