JAVA多线程之Exchanger
来源:互联网 发布:flashftp mac 破解版 编辑:程序博客网 时间:2024/05/18 01:41
来源:http://blog.csdn.net/huang_xw/article/details/7090162
package com.fei;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();}}
运行结果
服务生开始往杯子中添水:1374133265747
顾客开始喝水:1374133265747
服务生添水完毕:1374133270746
服务生等待与顾客交换杯子:1374133270746
顾客喝水完毕:1374133275761
顾客等待与服务生交换杯子:1374133275761
顾客与服务生交换杯子完毕:1374133275761
顾客开始喝水:1374133275761
服务生与顾客交换杯子完毕:1374133275761
服务生开始往杯子中添水:1374133275761
服务生添水完毕:1374133280775
服务生等待与顾客交换杯子:1374133280775
顾客喝水完毕:1374133285774
顾客等待与服务生交换杯子:1374133285774
服务生与顾客交换杯子完毕:1374133285774
顾客与服务生交换杯子完毕:1374133285774
- Java多线程之Exchanger
- JAVA多线程之Exchanger
- Java多线程之Exchanger
- Java多线程之Exchanger
- java多线程之Exchanger
- java 多线程之Exchanger
- java多线程之(Exchanger)
- (十二)java多线程之Exchanger
- Java多线程之Exchanger(一)
- java多线程同步工具之Exchanger
- Java基础:多线程之CountDownLatch、CyclicBarrier、Exchanger
- 多线程之Exchanger
- Java多线程十一 Exchanger
- java多线程[8]:Exchanger
- Java多线程(八)之Semaphore、CountDownLatch、CyclicBarrier、Exchanger
- Java多线程之~~~使用Exchanger在线程之间交换数据
- java多线程之通过Exchanger线程间传递数据
- Java多线程(八)之Semaphore、CountDownLatch、CyclicBarrier、Exchanger
- js中弹出新窗口的几种方法比较及与.net中的区别
- JS窗口问题处理:使弹出窗口保持前端显示的几种方法,及window窗体对象open()和showModalDialog()用法
- 设置屏幕分辨率有助于保护眼睛
- HTML 5 <base> 标签
- IE对话框showModalDialog(模态)和showModelessDialog
- JAVA多线程之Exchanger
- CH375与中断传输
- .net中常用的三十个方法
- 20130718:Linux内核编译
- Attributes.Add用途与用法
- 注册客户端js脚本的方法比较
- 10大流行的 Metro UI 风格的 Bootstrap 主题和模板
- html中的<mata>标签详解
- ASP.NET中javascript与后台代码如何通信,相互调用?