Java多线程之Exchanger
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相关推荐
- exchanger java_(十二)java多线程之Exchanger
引言 今天我们讲最后一个同步工具类Exchanger,这个比较简单,就是让两个线程交换数据. 理论 Exchanger只有两个方法而已,而且两个还是一样的,只是参数不通而已 exchange(V x) ...
- JAVA多线程之wait/notify
本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...
- Java多线程之Callable、Future和FutureTask
Java多线程之Callable接口 自己想总结一下的,看到一篇总结的更好的博客,就转载了,突然感觉真轻松,哈哈哈哈 文章转载于:Matrix海子:Java并发编程:Callable.Future和F ...
- Java多线程之Synchronized和Lock的区别
Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...
- Java多线程之CAS缺点
Java多线程之CAS缺点 目录: 循环时间开销很大 只能保证一个共享变量的原子操作 引来ABA问题及解决方案(重点) 1. 循环时间开销很大 通过看源码,我们发现有个do while,如果CAS失败 ...
- Java多线程之CAS深入解析
Java多线程之CAS深入解析 目录: CAS是什么 CAS底层原理Unsafe深入解析 CAS缺点 引子:蚂蚁花呗一面:讲一讲AtomicInteger,为什么要用CAS而不是synchronize ...
- Java多线程之volatile详解
Java多线程之volatile详解 目录: 什么是volatile? JMM内存模型之可见性 volatile三大特性之一:保证可见性 volatile三大特性之二:不保证原子性 volatile三 ...
- Java多线程之Semaphore用法
Java多线程之Semaphore用法 本文目录: Semaphore基本概念 Semaphore使用案例:3个停车位,6辆车去抢,走一辆,抢一个停车位. 1. Semaphore基本概念 在信号量上 ...
- Java多线程之CyclicBarrier用法
Java多线程之CyclicBarrier用法 本文目录 CyclicBarrier的基本概念 CyclicBarrier的案例:集齐7颗龙珠就可以召唤神龙 1. CyclicBarrier的基本概念 ...
最新文章
- Nvidia League Player:来呀比到天荒地老
- 大学计算机学情分析,大学生学情分析
- 用cisco设备解决ARP病毒
- 兮米安装包制作工具图文教程集锦电子书
- Centos7安装完毕后无法联网的解决方法(转)
- Atitit 图像处理知识点体系知识图谱 路线图attilax总结 v4 qcb.xlsx
- 深圳市计算机软件著作权资助,深圳市计算机软件著作权登记资助管理实施细则...
- 跑步减肥的正确姿势与方法 不再担心女生跑步腿会变粗
- Juc_无juc情况
- 基于CISe@ZnS新型近红外二区量子点生物探针(CuInS2/ZnS量子点,Cd掺杂ZnO量子点,InP/ZnS,荧光Ag2S量子点)
- RVDS-RealView Development Suite 4 0 Professional软件
- qq修改实名认证已达上限_王者荣耀实名认证系统,怎么二次修改
- tinymce富文本框照片上传
- 累加器实验总结计算机组成,计算机组成原理累加器实验报告
- gitlab安装及配置
- 【Axure交互教程】滑块控制图片放大缩小效果
- percona-toolkit的安装及简介
- 分享实录 | 阿里巴巴DevOps文化浅谈
- 关于宗海图WGS84转CGCS2000的问题
- 计算机处理器的参数及意义,电脑硬件小知识之:CPU的命名和基本参数