当前位置: 首页 > news >正文

java Concurrent包学习笔记(六):Exchanger

一、概述

Exchanger 是一个用于线程间协作的工具类,Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange 方法交换数据,如果第一个线程先执行exchange 方法,它会一直等待第二个线程也执行exchange 方法,当两个线程都到达同步点时,这两个线程就可以交换数据。

二、示例程序

package exchanger.demo;

import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author boshen
 * @date 2018/12/20
 */
public class ExchangerTest {
    class StudentThread implements Runnable{
        private String data;
        private Exchanger exchanger;
        StudentThread(String data, Exchanger exchanger){
            this.data = data;
            this.exchanger = exchanger;
        }
        public void run(){
            try {
                System.out.println(Thread.currentThread().getName()+":准备交换给对方的数据:" + data);
                String newData = exchanger.exchange(data).toString();
                System.out.println(Thread.currentThread().getName()+":收到对方的数据:" + newData);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args){
        ExchangerTest cb = new ExchangerTest();
        Exchanger exchanger = new Exchanger();
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.submit(cb.new StudentThread("张三",exchanger));
        executorService.submit(cb.new StudentThread("李四",exchanger));
        executorService.submit(cb.new StudentThread("王五",exchanger));
        executorService.submit(cb.new StudentThread("马六",exchanger));
        executorService.submit(cb.new StudentThread("赵七",exchanger));
        executorService.shutdown();
    }
}

执行结果:

pool-1-thread-2:准备交换给对方的数据:李四
pool-1-thread-1:准备交换给对方的数据:张三
pool-1-thread-1:收到对方的数据:李四
pool-1-thread-3:准备交换给对方的数据:王五
pool-1-thread-2:收到对方的数据:张三
pool-1-thread-4:准备交换给对方的数据:马六
pool-1-thread-4:收到对方的数据:王五
pool-1-thread-5:准备交换给对方的数据:赵七
pool-1-thread-3:收到对方的数据:马六

从以上可知:1和2相互交换了数据,3和4交换了数据,但是5一直在等待将数据交换给对方。因为Exchanger交换数据重点是在成对的线程之间,所以5没有交换同伴。

 

相关文章:

  • 理解 Web 中的Session
  • bzoj3295: [Cqoi2011]动态逆序对
  • 北大、微软提出NGra:高效大规模图神经网络计算
  • SQL Server事务日志管理的进阶,第5级:在完全恢复模式下管理日志
  • zabbix3.4 端口和进程监控配置
  • Java 面试之技术框架
  • db cursor
  • Kubeflow 公布 1.0 路线图:2019 年实现 API 稳定
  • Finale
  • String不得不说的那些事
  • 利用React 16.6新特性优化应用性能
  • ajax的19道经典面试题
  • 大数据就业前景,分析的太到位了
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • 程序员的本质
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • DOM的那些事
  • Javascript Math对象和Date对象常用方法详解
  • js 实现textarea输入字数提示
  • JS变量作用域
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Vue官网教程学习过程中值得记录的一些事情
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 猴子数据域名防封接口降低小说被封的风险
  • 简析gRPC client 连接管理
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 批量截取pdf文件
  • 入门级的git使用指北
  • 试着探索高并发下的系统架构面貌
  • 突破自己的技术思维
  • 用mpvue开发微信小程序
  • 正则表达式小结
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (06)金属布线——为半导体注入生命的连接
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (day6) 319. 灯泡开关
  • (NSDate) 时间 (time )比较
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (多级缓存)多级缓存
  • (二)linux使用docker容器运行mysql
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (数据结构)顺序表的定义
  • (一)Java算法:二分查找