如果两个线程在运行过程中需要交换彼此的信息,比如一个数据或者使用的空间,就需要用到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. C#6 冒泡 折半查找 二维数组

    人类思维--计算机逻辑思维 逻辑思维--代码实现 写书法: 描红--临摹--碑贴--自成一体--草 章节复习: 数组:一维,二维,多维 一维:豆角.连续,同一类型. 定义:数据类型[] 数组名=new ...

  2. python正则表达式练习篇

    练习一: 利用who命令输出所有已经登录系统的用户的信息,并把登录名.用户登录时的电传.登录时间.登录地址利用正则表达式分割开来. 数据的格式: %who wesc console Jun 20 20 ...

  3. 远程连接mysql数据慢的问题

    由于公司没有服务器,买的阿里云的服务器用于开发,所以就在本地连接服务器的mysql. 连接很慢,打开表也很慢,一开始没多想,以为是网络慢而已. 最近,开发经常要使用navicat连接数据库,实在是太慢 ...

  4. SharePreferences类的使用

    简述:以key-value键值对的方式将数据保存到Android自身定义的文件夹(/data/data/<package name>/shared_prefs  root才可见的文件夹)中 ...

  5. FileProvider是个什么东西?

    FileProvider是个什么东西? 在<读取并监控文件的变化>中,我们通过三个简单的实例演示从编程的角度对文件系统做了初步的体验,接下来我们继续从设计的角度来继续认识它.这个抽象的文件 ...

  6. .Net缓存

    近期研究了一下.Net的缓存,据说可以提高系统的性能. .Net缓存分为两种HttpRuntime.Cache和HttpContext.Current.Cache 不过从网上查找资料,说两种缓存其实是 ...

  7. Android 为应用添加数字角标

    今天在论坛上看到了一个帖子,终于搞清了我很久以来的一个困惑,android到底能不能实现ios的角标效果,QQ是怎么实现的.看了这个帖子顿时终于解除了我的困惑. 先说一个下大概的思路: 大家都知道an ...

  8. Android上运行本地c

    在android代码中编译一个可执行文件,主要功能是对文件的读写, 简单贴出来: #include <errno.h> #include <stdio.h> #include  ...

  9. Qt部件学习之-烧鹅

    1,布局管理器 candidates

  10. C#,json字符串转换成Json对象

    将JSON的请求参数转化为C#可序列化对象! JSON请求参数: "{\"id\":1,"name":"张三","dep ...