Concurrent -- 08 -- Exchanger用法解析

原文链接:Concurrent – 08 – Exchanger用法解析


相关文章:


Exchanger,即交换器,是一个同步工具类,用于控制两个线程在同步点处的数据交换

Exchanger 提供了一个同步点 (调用 exchange() 方法的地方即为同步点),当一个线程先执行到达同步点后,会被阻塞,直到另一个线程也进入到同步点为止,当两个线程都到达该同步点后,就会进行数据交换


  • 举例说明 1

    • ExchangerTest.java

      public class ExchangerTest {
      
          public static void main(String[] args) {
              Exchanger<String> exchanger = new Exchanger<>();
              new Thread(new Boy(exchanger)).start();
              new Thread(new Girl(exchanger)).start();
              
              // 女生慢慢地从教室里走出来...
              // 男生说:【我其实暗恋你很久了...】
              // 女生说:【我很喜欢你...】
          }
      }
      
      class Boy implements Runnable {
      
          private Exchanger<String> exchanger;
      
          public Boy(Exchanger<String> exchanger) {
              this.exchanger = exchanger;
          }
      
          @Override
          public void run() {
              try {
                  System.out.println("女生慢慢地从教室里走出来...");
                  TimeUnit.SECONDS.sleep(2);
                  // 男生对女生说的话
                  String boy = exchanger.exchange("我很喜欢你...");
                  System.out.println("男生说:【" + boy +"】");
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
      }
      
      class Girl implements Runnable {
      
          private Exchanger<String> exchanger;
      
          public Girl(Exchanger<String> exchanger) {
              this.exchanger = exchanger;
          }
          
          @Override
          public void run() {
              try {
                  // 女生对男生说的话
                  String girl = exchanger.exchange("我其实暗恋你很久了...");
                  System.out.println("女生说:【" + girl +"】");
              } catch (Exception e) {  
                  e.printStackTrace();  
              } 
          }
      }
      
      • 如上所示,调用 exchange() 方法会阻塞当前线程,使其进入同步点,当另一个线程也调用 exchange() 方法到达同步点后,两者就会进行数据交换

  • 举例说明 2

    • ExchangerTest.java

      public class ExchangerTest {
      
          public static void main(String[] args) {
              Exchanger<String> exchanger = new Exchanger<>();
              new Thread(new Boy(exchanger)).start();
              new Thread(new Girl(exchanger)).start();
              
              // 女生慢慢地从教室里走出来...
              // java.util.concurrent.TimeoutException
              //      at java.util.concurrent.Exchanger.exchange(Exchanger.java:626)
              //      at com.xj.current.tool.Girl.run(ExchangerTest.java:55)
              //      at java.lang.Thread.run(Thread.java:748)
      
          }
      }
      
      class Boy implements Runnable {
      
          private Exchanger<String> exchanger;
      
          public Boy(Exchanger<String> exchanger) {
              this.exchanger = exchanger;
          }
      
          @Override
          public void run() {
              try {
                  System.out.println("女生慢慢地从教室里走出来...");
                  TimeUnit.SECONDS.sleep(2);
                  // 男生对女生说的话
                  String boy = exchanger.exchange("我很喜欢你...");
                  System.out.println("男生说:【" + boy +"】");
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
      }
      
      class Girl implements Runnable {
      
          private Exchanger<String> exchanger;
      
          public Girl(Exchanger<String> exchanger) {
              this.exchanger = exchanger;
          }
          
          @Override
          public void run() {
              try {
                  // 女生对男生说的话
                  String girl = exchanger.exchange("我其实暗恋你很久了...", 1, TimeUnit.SECONDS);
                  System.out.println("女生说:【" + girl +"】");
              } catch (Exception e) {  
                  e.printStackTrace();  
              } 
          }
      }
      
      • 如上所示, exchange() 方法还可以指定等待时间,如果当前线程在指定的等待时间内,没有等到另一个线程到达同步点,则会抛出 TimeoutException 异常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值