`

JDK5.0新特性系列---11.5.4线程 同步装置之Exchanger

 
阅读更多

 

/**
 * Exchanger让两个线程互换信息
 * 实例模拟服务生和顾客,服务生往空杯子中倒水,顾客从装满水的杯子中喝水,然后互换杯子,服务生接着倒水,顾客接着喝水.
 */
/**
 * 使用Exchanger的关键技术点如下:
 * 1.初始化Exchanger对象时,可以通过泛型指定杯子能交换的信息类型.如"new Exchanger<String>;"表示只能交换String类型的信息
 * 2.Exchanger的exchange方法表示当前线程准备交换信息,等待其他线程与它交换信息.当有其他线程调用该Exchanger对象的exchange方法时,立即交换信息
 */
public class ExchangerTest {
       //描述一个装水的杯子
       public static class Cup{
              private boolean full = false; //标识杯子是否有水
              public Cup(boolean full){
                     this.full = full;
              }
              //添水,假设需要5s
              public void addWater(){
                     if(!this.full){
                            try{
                                   Thread.sleep(5000);
                            }catch(InterruptedException e){
                            }
                            this.full = true;
                     }
              }
              //喝水,假设需要10s
              public 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());
                                          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();
       }
}
/**
Waiter是模拟服务生的线程,首先往空杯子中添水,然后调用Exchanger的exchange方法,等待和别人交换杯子.Customer是模拟了顾客的线程,首先把装满水的杯子喝光,然后调用Exchange的exchange方法,等待和别人交换杯子.当服务生和顾客都准备交换杯子时,由Exchanger将服务生手中装满水的杯子和顾客手中的空杯子交换.服务生可以继续倒水,而顾客可以继续喝水.
*/
分享到:
评论

相关推荐

    JDK5.0_下载-安装-配置

    JDK5.0是Oracle公司于2004年发布的一个重要版本,引入了许多新特性,对Java编程语言做了重大改进,提升了开发效率。要下载JDK5.0,首先访问Oracle的官方网站历史版本页面,或者通过互联网上的存档链接找到该版本的...

    jdk5.0新特性

    ### JDK 5.0新特性详解 #### 一、自动装箱与自动拆箱 在JDK 5.0中,引入了一个非常实用的功能——自动装箱和自动拆箱,这极大地方便了开发者在处理基本数据类型和它们对应的封装类之间的转换。以前,我们可能需要...

    part 10 [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part

    [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part

    JDK 5.0.zip

    压缩包中的文件`jdk-1_5_0-windows-i586.exe`是Windows平台上的JDK 5.0安装程序,适用于32位系统。安装这个版本的JDK后,开发者可以体验到上述的新特性,并在项目中使用它们来提升代码质量。需要注意的是,随着Java...

    JDK5.0新特性 常量 、枚举、 for each、反射

    在Java开发领域,JDK 5.0是一个重要的里程碑,引入了多项显著的新特性,极大地提升了编程效率和代码质量。本文将深入探讨其中的四个关键特性:常量、枚举、for each循环(也称为增强型for循环)以及反射。 首先,让...

    jdk-8u311-windows-x64.exe

    jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u311-windows-x64.exe.zip jdk-8u311-windows-x64.exe jdk-8u...

    JDK5.0 新特性

    在JDK 5.0中,Java引入了一系列重要的新特性,极大地提升了开发效率和代码的可读性。这些新特性包括自动包装和解包、增强的for循环、可变参数方法、printf风格的格式化输出、枚举类型以及静态导入等。 首先,自动...

    浪曦 - JDK5.0新特性.part2

    浪曦 - JDK5.0新特性.part2

    浪曦 - JDK5.0新特性.part3

    浪曦 - JDK5.0新特性.part3

    part6 [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part

    [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part

    part5 [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part

    [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part [浪曦][原创]JDK5.0新特性[风中叶老师主讲]共10 part

    JDK5.0新特性(3)——枚举

    在Java编程语言中,JDK 5.0的发布带来了一系列重要的新特性,极大地提升了开发效率和代码质量。其中,枚举(Enum)是引入的一个关键特性,它为表示固定集合中的常量提供了强大而安全的支持。这篇博客将深入探讨JDK ...

    浪曦 - JDK5.0新特性.part5.rar

    浪曦 - JDK5.0新特性.part5.rar

    浪曦 - JDK5.0新特性.part4.rar

    浪曦 - JDK5.0新特性.part4.rar

    part3 [浪曦][原创]JDK5.0新特性[风中叶老师主讲

    [浪曦][原创]JDK5.0新特性[风中叶老师主讲[浪曦][原创]JDK5.0新特性[风中叶老师主讲[浪曦][原创]JDK5.0新特性[风中叶老师主讲

    part1 [浪曦][原创]JDK5.0新特性[风中叶老师主讲]

    [浪曦][原创]JDK5.0新特性[风中叶老师主讲][浪曦][原创]JDK5.0新特性[风中叶老师主讲][浪曦][原创]JDK5.0新特性[风中叶老师主讲]

    JDK5.0新特性 反射、枚举.rar

    在`JDK5.0新特性 (2)——反射.doc`中,你可能会学习到如何使用`java.lang.Class`对象来获取类信息,以及如何使用`java.lang.reflect`包中的`Constructor`、`Method`和`Field`类来操作类的构造器、方法和字段。...

    jdk5.0 tomcat5.0配置全攻略

    ### JDK 5.0 和 Tomcat 5.0 配置全攻略 #### 环境搭建背景 对于初入Java领域的新手来说,环境配置往往是一个不小的挑战。本篇文章旨在帮助那些在Java学习过程中遇到环境配置问题的朋友,提供一份详尽的JDK 5.0 和 ...

    jdk-8u172-windows-x64.exe、jdk-8u251-windows-x64.exe、jdk-14.0.1_windows-x64_bin.e

    本话题涉及三个不同版本的JDK:jdk-8u172-windows-x64.exe、jdk-8u251-windows-x64.exe以及jdk-14.0.1_windows-x64_bin.exe,分别对应Java 8的两个更新版本和Java 14的一个版本。 首先,让我们详细了解一下Java 8。...

    jdk5.0新特性汇总(超级详细)

    ### JDK 5.0 新特性详解 #### 一、增强的 for 循环(ForEach Loop) JDK 5.0 引入了增强的 `for` 循环,也称为 foreach 循环,用于简化对集合和数组的操作。这种循环语法更加简洁,易于阅读。 **示例代码:** ``...

Global site tag (gtag.js) - Google Analytics