线程中的同步辅助类Exchanger
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的更多相关文章
- 线程中的同步辅助类CountDownLatch
四个类可协助实现常见的专用同步语句.Semaphore 是一个经典的并发工具.CountDownLatch 是一个极其简单但又极其常用的实用工具,用于在保持给定数目的信号.事件或条件前阻塞执行.Cyc ...
- 线程中的同步辅助类Semaphore
同步辅助类 线程池 并发集合类 都是在线程同步的基础上增加了一些同步的东西,在线程同步的基础上更好的实现线程同步.实现的效率更高,更方便而已. 多线程并不是很难 需要你把代码写出来...然后分析运 ...
- Java线程中的同步
1.对象与锁 每一个Object类及其子类的实例都拥有一个锁.其中,标量类型int,float等不是对象类型,但是标量类型可以通过其包装类来作为锁.单独的成员变量是不能被标明为同步的.锁只能用在使用了 ...
- python线程中的同步问题
多线程开发可能遇到的问题 假设两个线程t1和t2都要对num=0进行增1运算,t1和t2都各对num修改1000000次,num的最终的结果应该为2000000.但是由于是多线程访问,有可能出现下面情 ...
- 线程同步辅助类——Exchanger
下面是java6中文API对Exchanger的解释: 能够在对中对元素进行配对和交换的线程的同步点.每一个线程将条目上的某个方法呈现给 exchange 方法.与伙伴线程进行匹配,而且在返回时接收其 ...
- JDK中线程中实现同步等待闭环的一种方式
实际Thread类自带的join方法就实现了线程同步等待,具体可以通过案例实践,如下: 本文的重点不是join,而是另一种设计的同步等待实现,涉及的关键类有:Thread.Runable.Callab ...
- java线程中的同步锁和互斥锁有什么区别?
两者都包括对资源的独占. 区别是 1:互斥是通过竞争对资源的独占使用,彼此没有什么关系,也没有固定的执行顺序. 2:同步是线程通过一定的逻辑顺序占有资源,有一定的合作关系去完成任务.
- CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 主要方法 public CountDownLatch(int count); pu ...
- Java中的5种同步辅助类
当你使用synchronized关键字的时候,是通过互斥器来保障线程安全以及对共享资源的同步访问.线程间也经常需要更进一步的协调执行,来完成复杂的并发任务,比如wait/notify模式就是一种在多线 ...
随机推荐
- dj 模型层orm-1
ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的 ...
- vba中布尔类型、字符串操作
在vba中,bool类型数据可以参与数学运算,true为-1,false为0 Sub mysub() Dim mybool As Boolean Debug.Print Debug.Print myb ...
- Struts2-result
所有result-type <result-types> <result-type name="chain" class="com.opensympho ...
- PHP实现视频文件上传完整实例
这篇文章主要介绍了PHP实现视频文件上传的技巧,包含了PHP配置信息的设计及大文件的处理,需要的朋友可以参考下 本文以一个完整实例的形式实现了视频文件上传的功能.虽然是比较基础的应用,仍有一定的 ...
- C#-VS远程通信
上下文 应用程序内的一套规则.例如使用了begentransaction,就建立了一个规则:再如把synchronization特性应用到某个对象,是多个线程轮流访问这个对象,这也在当前应用产生了一个 ...
- 记一次spring里bean无法注入的历程
应用启动的时候失败,看了下异常,是这个---NoUniqueBeanDefinitionException. 大家都知道,这是因为有俩个类型相同的实例,在被注入的时候,spring不知道该用哪个. 但 ...
- 使用Xshell在Windows系统和Linux系统之间进行文件传输
版权声明:本文为转载内容. 原博客内容https://blog.csdn.net/love666666shen/article/details/75742077 Windows系统在安装虚拟机cent ...
- ES版本控制
版本控制 ElasticSearch采用了乐观锁来保证数据的一致性,也就是说,当用户对document进行操作时,并不需要对该doucument作加锁和解锁的操作,只需要指定要操作的版本即可.当版本号 ...
- python之基础1
一.python介绍 介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,Guido开始写能够解释Python语言语法的解释器.Python这个名字 ...
- 安装部署Ceph Calamari
根据http://ovirt-china.org/mediawiki/index.php/%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2Ceph_Calamari 原文如下: ...