线程中的同步辅助类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模式就是一种在多线 ...
随机推荐
- centos7 新增ip
1.进入network-scripts目录:cd /etc/sysconfig/network-scripts/ 2.复制ifcfg-eth0: cp ifcfg-eth0 ifcfg-eth0:0 ...
- Redis-环境搭建
Redis官方不提供Windows版,不过微软开源组织提供了Windows版本的Redis,此处将安装Windows版的Reids,供学习使用. 1.下载Windows版Redis安装包: 安装包地址 ...
- 启动Android App时,动态将Sqlite数据库文件导入到手机中类方法
package com.aqioo.db; import java.io.File; import java.io.FileOutputStream; import java.io.InputStre ...
- reload maven project' has encountered a proble" 问题
由于重重原因,我取消maven的下载(可能是jar包没有公服镜像).导致重新打开sts 时发生异常. 在网上寻找到资料,发现需要删除${workspace}\.metadata\.plugins\or ...
- jpa命名规范
Keyword Sample JPQL snippet And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname ...
- 学习c++需要知道
1.c++投入和经济产出比目前较低,c++很复杂,学习难度高.周期长.而且开发效率低. 2.但是c++趋紧于完美语言,它囊括了多种编程范型.它运行效率高,对计算机有着极致的控制能力.适用于低层. 3. ...
- linux 添加本地yum源
1.查看自己是否安装了 yum rpm -qa|grep yum 查看yum配置文件 2.创建一个文件夹 用于挂载光盘 这里创建到/media下 取名叫cdrom mkdir /media/cdrom ...
- U盘或者移动银盘退出时一直显示占用中问题解决--最粗暴解决方式
问题描述: ---------------------------弹出 USB 大容量存储设备 时出问题---------------------------Windows 无法停用“通用卷”设备,原 ...
- LDO-AMS1117
AMS1117 1.是AMS艾默森公司简称.与AMS1117对应的IC有LM1117.AMS1117的最大输入电压为15V,而LM1117的极限是20V. 2.其输出电压有固定式(1.5V,1.8V, ...
- nginx 访问频率控制
Nginx访问频率控制 HTTP服务器的吞吐率(单位时间吞吐量)通常有一个上限,尤其是普通配置的机器,在带宽够的情况下,用压测工具经常能把服务器压出翔,为了线上环境稳定性,防止恶意攻击影响到其他用户, ...