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. dj 模型层orm-1

    ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...

  2. vba中布尔类型、字符串操作

    在vba中,bool类型数据可以参与数学运算,true为-1,false为0 Sub mysub() Dim mybool As Boolean Debug.Print Debug.Print myb ...

  3. Struts2-result

    所有result-type <result-types> <result-type name="chain" class="com.opensympho ...

  4. PHP实现视频文件上传完整实例

    这篇文章主要介绍了PHP实现视频文件上传的技巧,包含了PHP配置信息的设计及大文件的处理,需要的朋友可以参考下    本文以一个完整实例的形式实现了视频文件上传的功能.虽然是比较基础的应用,仍有一定的 ...

  5. C#-VS远程通信

    上下文 应用程序内的一套规则.例如使用了begentransaction,就建立了一个规则:再如把synchronization特性应用到某个对象,是多个线程轮流访问这个对象,这也在当前应用产生了一个 ...

  6. 记一次spring里bean无法注入的历程

    应用启动的时候失败,看了下异常,是这个---NoUniqueBeanDefinitionException. 大家都知道,这是因为有俩个类型相同的实例,在被注入的时候,spring不知道该用哪个. 但 ...

  7. 使用Xshell在Windows系统和Linux系统之间进行文件传输

    版权声明:本文为转载内容. 原博客内容https://blog.csdn.net/love666666shen/article/details/75742077 Windows系统在安装虚拟机cent ...

  8. ES版本控制

    版本控制 ElasticSearch采用了乐观锁来保证数据的一致性,也就是说,当用户对document进行操作时,并不需要对该doucument作加锁和解锁的操作,只需要指定要操作的版本即可.当版本号 ...

  9. python之基础1

    一.python介绍 介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写能够解释Python语言语法的解释器.Python这个名字 ...

  10. 安装部署Ceph Calamari

    根据http://ovirt-china.org/mediawiki/index.php/%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2Ceph_Calamari 原文如下: ...