import java.util.concurrent.Exchanger;/*** Exchanger让两个线程可以互换信息。* 例子中服务生线程往空的杯子里倒水,顾客线程从装满水的杯子里喝水,* 然后通过Exchanger双方互换杯子,服务生接着往空杯子里倒水,顾客接着喝水,* 然后交换,如此周而复始。*/
public class ExchangerTest {// 描述一个装水的杯子public static class Cup{// 标识杯子是否有水private boolean full = false;public Cup(boolean full){this.full = full;}// 添水,假设需要5spublic void addWater(){if (!this.full){try {Thread.sleep(5000);} catch (InterruptedException e) {}this.full = true;}}// 喝水,假设需要10spublic void drinkWater(){if (this.full){try {Thread.sleep(10000);} catch (InterruptedException e) {}this.full = false;}}}public static void testExchanger() {//  初始化一个Exchanger,并规定可交换的信息类型是杯子final Exchanger<Cup> exchanger = new Exchanger<Cup>();// 初始化一个空的杯子和装满水的杯子final Cup initialEmptyCup = new Cup(false); final Cup initialFullCup = new Cup(true);//服务生线程class Waiter implements Runnable {public void run() {Cup currentCup = initialEmptyCup;try {int i=0;while (i < 2){System.out.println("服务生开始往杯子中添水:"+ System.currentTimeMillis());// 往空的杯子里加水currentCup.addWater();System.out.println("服务生添水完毕:"+ System.currentTimeMillis());// 杯子满后和顾客的空杯子交换System.out.println("服务生等待与顾客交换杯子:"+ System.currentTimeMillis());currentCup = exchanger.exchange(currentCup);System.out.println("服务生与顾客交换杯子完毕:"+ System.currentTimeMillis());i++;}} catch (InterruptedException ex) {}}}//顾客线程class Customer implements Runnable {public void run() {Cup currentCup = initialFullCup;try {int i=0;while (i < 2){System.out.println("顾客开始喝水:"+ System.currentTimeMillis());//把杯子里的水喝掉currentCup.drinkWater();System.out.println("顾客喝水完毕:"+ System.currentTimeMillis());//将空杯子和服务生的满杯子交换System.out.println("顾客等待与服务生交换杯子:"+ System.currentTimeMillis());currentCup = exchanger.exchange(currentCup);System.out.println("顾客与服务生交换杯子完毕:"+ System.currentTimeMillis());i++;}} catch (InterruptedException ex) {}}}new Thread(new Waiter()).start();new Thread(new Customer()).start();}public static void main(String[] args) {ExchangerTest.testExchanger();}
}

Java多线程之Exchanger相关推荐

  1. exchanger java_(十二)java多线程之Exchanger

    引言 今天我们讲最后一个同步工具类Exchanger,这个比较简单,就是让两个线程交换数据. 理论 Exchanger只有两个方法而已,而且两个还是一样的,只是参数不通而已 exchange(V x) ...

  2. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  3. Java多线程之Callable、Future和FutureTask

    Java多线程之Callable接口 自己想总结一下的,看到一篇总结的更好的博客,就转载了,突然感觉真轻松,哈哈哈哈 文章转载于:Matrix海子:Java并发编程:Callable.Future和F ...

  4. Java多线程之Synchronized和Lock的区别

    Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...

  5. Java多线程之CAS缺点

    Java多线程之CAS缺点 目录: 循环时间开销很大 只能保证一个共享变量的原子操作 引来ABA问题及解决方案(重点) 1. 循环时间开销很大 通过看源码,我们发现有个do while,如果CAS失败 ...

  6. Java多线程之CAS深入解析

    Java多线程之CAS深入解析 目录: CAS是什么 CAS底层原理Unsafe深入解析 CAS缺点 引子:蚂蚁花呗一面:讲一讲AtomicInteger,为什么要用CAS而不是synchronize ...

  7. Java多线程之volatile详解

    Java多线程之volatile详解 目录: 什么是volatile? JMM内存模型之可见性 volatile三大特性之一:保证可见性 volatile三大特性之二:不保证原子性 volatile三 ...

  8. Java多线程之Semaphore用法

    Java多线程之Semaphore用法 本文目录: Semaphore基本概念 Semaphore使用案例:3个停车位,6辆车去抢,走一辆,抢一个停车位. 1. Semaphore基本概念 在信号量上 ...

  9. Java多线程之CyclicBarrier用法

    Java多线程之CyclicBarrier用法 本文目录 CyclicBarrier的基本概念 CyclicBarrier的案例:集齐7颗龙珠就可以召唤神龙 1. CyclicBarrier的基本概念 ...

最新文章

  1. Nvidia League Player:来呀比到天荒地老
  2. 大学计算机学情分析,大学生学情分析
  3. 用cisco设备解决ARP病毒
  4. 兮米安装包制作工具图文教程集锦电子书
  5. Centos7安装完毕后无法联网的解决方法(转)
  6. Atitit 图像处理知识点体系知识图谱 路线图attilax总结 v4 qcb.xlsx
  7. 深圳市计算机软件著作权资助,深圳市计算机软件著作权登记资助管理实施细则...
  8. 跑步减肥的正确姿势与方法 不再担心女生跑步腿会变粗
  9. Juc_无juc情况
  10. 基于CISe@ZnS新型近红外二区量子点生物探针(CuInS2/ZnS量子点,Cd掺杂ZnO量子点,InP/ZnS,荧光Ag2S量子点)
  11. RVDS-RealView Development Suite 4 0 Professional软件
  12. qq修改实名认证已达上限_王者荣耀实名认证系统,怎么二次修改
  13. tinymce富文本框照片上传
  14. 累加器实验总结计算机组成,计算机组成原理累加器实验报告
  15. gitlab安装及配置
  16. 【Axure交互教程】滑块控制图片放大缩小效果
  17. percona-toolkit的安装及简介
  18. 分享实录 | 阿里巴巴DevOps文化浅谈
  19. 关于宗海图WGS84转CGCS2000的问题
  20. 计算机处理器的参数及意义,电脑硬件小知识之:CPU的命名和基本参数

热门文章

  1. Go进阶:Go语言最热门的开源Web开发框架总结
  2. win10启动0xc0000001错误
  3. call方法PHP,php __call方法如何使用
  4. JAVA高频面试题目集锦
  5. BMW专注研发、5年累计超50亿欧元
  6. 徐宗本院士:智能制造的大数据机遇与挑战
  7. 使用ajax发送数组请求,Ajax请求传递数组参数
  8. java Thread的介绍【电竞杜小帅】
  9. 二叉树、二叉搜索树,平衡二叉树(旋转)红黑树(红黑规则)
  10. 在 Win10 系统下安装 JDK 及配置环境变量的方法