Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的。

允许两条线程之间交换数据.Exchanger的exchange方法是阻塞的,当其他线程也调用了该方法,就发生数据的交换,尽量不要在多(大于两条)线程之间进行数据的交换.

Exchanger可能在应用程序(遗传算法和管道设计)中很有用.

线程之间的数据交换:Exchanger

允许两条线程之间交换数据。Exchanger的exchange方法是阻塞的,当其他线程也调用了该方法,就发生数据的交换。尽量不要在多(>2)条线程之间进行数据的交换。

exchange是一个阻塞方法,如果没有其他的线程和它换,就会一直等待着直到有一个线程也调用了exchange方法,然后它们两者交换.

Exchanger 可能在应用程序(比如遗传算法和管道设计)中很有用

如果是多条(大于2)线程使用exchange的方法就会发生数据错乱.exchange不管和它交换数据的是谁,它只管有人调用了这个exchange方法,就和其交换数据.

场景:

我卖包子,一个哥们要买包子,我把包子给他了.他把钱给我了.

 import java.util.Random;
import java.util.concurrent.Exchanger;
import java.util.concurrent.TimeUnit; public class ExchangerDemo { public static void main(String[] args) {
final Exchanger<String> exchanger = new Exchanger<String>();//String 泛型 是交换的数据的数据类型
//for (int i = 0; i < 3; i++) {//如果是多条(大于2)线程使用exchange的方法就会发生数据错乱.exchange不管和它交换数据的是谁,它只管有人调用了这个exchange方法. new Thread(new Runnable() { @Override
public void run() { try {
System.out.println(Thread.currentThread().getName()
+ ": 卖包子。。。");
TimeUnit.SECONDS.sleep(new Random().nextInt(5));
String data1 = "包子";
String data2 = exchanger.exchange(data1);//把包子给买包子的人
System.out.println(Thread.currentThread().getName()
+ " : 拿到了" + data2); } catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start(); new Thread(new Runnable() { @Override
public void run() { try {
System.out
.println("-->"
+ Thread.currentThread().getName()
+ ": 买包子。。。");
TimeUnit.SECONDS.sleep(new Random().nextInt(5));
String data1 = "10元";
String data2 = exchanger.exchange(data1);//把钱给卖包子的
System.out.println(Thread.currentThread().getName()
+ " : 拿到了" + data2); } catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
// }
}
}

运行结果:

 Thread-0: 卖包子。。。
-->Thread-1: 买包子。。。
Thread-0 : 拿到了10元
Thread-1 : 拿到了包子

如果把上面的for循环打开:

 Thread-0: 卖包子。。。
-->Thread-1: 买包子。。。
Thread-2: 卖包子。。。
-->Thread-3: 买包子。。。
Thread-4: 卖包子。。。
-->Thread-5: 买包子。。。
Thread-5 : 拿到了10元
Thread-3 : 拿到了10元
Thread-2 : 拿到了10元
Thread-1 : 拿到了包子
Thread-4 : 拿到了包子
Thread-0 : 拿到了包子

线程中的同步辅助类Exchanger的更多相关文章

  1. 线程中的同步辅助类CountDownLatch

    四个类可协助实现常见的专用同步语句.Semaphore 是一个经典的并发工具.CountDownLatch 是一个极其简单但又极其常用的实用工具,用于在保持给定数目的信号.事件或条件前阻塞执行.Cyc ...

  2. 线程中的同步辅助类Semaphore

    同步辅助类  线程池  并发集合类 都是在线程同步的基础上增加了一些同步的东西,在线程同步的基础上更好的实现线程同步.实现的效率更高,更方便而已. 多线程并不是很难 需要你把代码写出来...然后分析运 ...

  3. Java线程中的同步

    1.对象与锁 每一个Object类及其子类的实例都拥有一个锁.其中,标量类型int,float等不是对象类型,但是标量类型可以通过其包装类来作为锁.单独的成员变量是不能被标明为同步的.锁只能用在使用了 ...

  4. python线程中的同步问题

    多线程开发可能遇到的问题 假设两个线程t1和t2都要对num=0进行增1运算,t1和t2都各对num修改1000000次,num的最终的结果应该为2000000.但是由于是多线程访问,有可能出现下面情 ...

  5. 线程同步辅助类——Exchanger

    下面是java6中文API对Exchanger的解释: 能够在对中对元素进行配对和交换的线程的同步点.每一个线程将条目上的某个方法呈现给 exchange 方法.与伙伴线程进行匹配,而且在返回时接收其 ...

  6. JDK中线程中实现同步等待闭环的一种方式

    实际Thread类自带的join方法就实现了线程同步等待,具体可以通过案例实践,如下: 本文的重点不是join,而是另一种设计的同步等待实现,涉及的关键类有:Thread.Runable.Callab ...

  7. java线程中的同步锁和互斥锁有什么区别?

    两者都包括对资源的独占. 区别是 1:互斥是通过竞争对资源的独占使用,彼此没有什么关系,也没有固定的执行顺序. 2:同步是线程通过一定的逻辑顺序占有资源,有一定的合作关系去完成任务.

  8. CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

    CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); pu ...

  9. Java中的5种同步辅助类

    当你使用synchronized关键字的时候,是通过互斥器来保障线程安全以及对共享资源的同步访问.线程间也经常需要更进一步的协调执行,来完成复杂的并发任务,比如wait/notify模式就是一种在多线 ...

随机推荐

  1. centos7 新增ip

    1.进入network-scripts目录:cd /etc/sysconfig/network-scripts/ 2.复制ifcfg-eth0: cp ifcfg-eth0 ifcfg-eth0:0 ...

  2. Redis-环境搭建

    Redis官方不提供Windows版,不过微软开源组织提供了Windows版本的Redis,此处将安装Windows版的Reids,供学习使用. 1.下载Windows版Redis安装包: 安装包地址 ...

  3. 启动Android App时,动态将Sqlite数据库文件导入到手机中类方法

    package com.aqioo.db; import java.io.File; import java.io.FileOutputStream; import java.io.InputStre ...

  4. reload maven project' has encountered a proble" 问题

    由于重重原因,我取消maven的下载(可能是jar包没有公服镜像).导致重新打开sts 时发生异常. 在网上寻找到资料,发现需要删除${workspace}\.metadata\.plugins\or ...

  5. jpa命名规范

      Keyword Sample JPQL snippet And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname ...

  6. 学习c++需要知道

    1.c++投入和经济产出比目前较低,c++很复杂,学习难度高.周期长.而且开发效率低. 2.但是c++趋紧于完美语言,它囊括了多种编程范型.它运行效率高,对计算机有着极致的控制能力.适用于低层. 3. ...

  7. linux 添加本地yum源

    1.查看自己是否安装了 yum rpm -qa|grep yum 查看yum配置文件 2.创建一个文件夹 用于挂载光盘 这里创建到/media下 取名叫cdrom mkdir /media/cdrom ...

  8. U盘或者移动银盘退出时一直显示占用中问题解决--最粗暴解决方式

    问题描述: ---------------------------弹出 USB 大容量存储设备 时出问题---------------------------Windows 无法停用“通用卷”设备,原 ...

  9. LDO-AMS1117

    AMS1117 1.是AMS艾默森公司简称.与AMS1117对应的IC有LM1117.AMS1117的最大输入电压为15V,而LM1117的极限是20V. 2.其输出电压有固定式(1.5V,1.8V, ...

  10. nginx 访问频率控制

    Nginx访问频率控制 HTTP服务器的吞吐率(单位时间吞吐量)通常有一个上限,尤其是普通配置的机器,在带宽够的情况下,用压测工具经常能把服务器压出翔,为了线上环境稳定性,防止恶意攻击影响到其他用户, ...