软件编程
位置:首页>> 软件编程>> java编程>> Java并发编程之Exchanger方法详解

Java并发编程之Exchanger方法详解

作者:我真的不会Java啊  发布时间:2022-08-22 02:44:41 

标签:Java,并发编程,Exchanger

简介

Exchanger是一个用于线程间数据交换的工具类,它提供一个公共点,在这个公共点,两个线程可以交换彼此的数据。

当一个线程调用exchange方法后将进入等待状态,直到另外一个线程调用exchange方法,双方完成数据交换后继续执行。

Exchanger的使用

方法介绍

exchange(V x):阻塞当前线程,直到另外一个线程调用exchange方法或者当前线程被中断。

  1. x : 需要交换的对象。

exchange(V x, long timeout, TimeUnit unit):阻塞当前线程,直到另外一个线程调用exchange方法或者当前线程被中断或者等待超时。

  • x: 需要交换的对象。

  • timeout:超时时间。

  • unit:超时时间单位。

exchange方法正常情况返回交换到的对象,当当前线程被中断或者等待超时时,exchange方法返回null。

示例1:A同学和B同学交换各自收藏的大片


public class Demo {
   public static void main(String[] args) {
       Exchanger<String> stringExchanger = new Exchanger<>();

Thread studentA = new Thread(() -> {
           try {
               String dataA = "A同学收藏多年的大片";
               String dataB = stringExchanger.exchange(dataA);
               System.out.println("A同学得到了" + dataB);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       });

Thread studentB = new Thread(() -> {
           try {
               String dataB = "B同学收藏多年的大片";
               String dataA = stringExchanger.exchange(dataB);
               System.out.println("B同学得到了" + dataA);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       });

studentA.start();
       studentB.start();
   }
}

/*
* 输出结果:
* B同学得到了A同学收藏多年的大片
* A同学得到了B同学收藏多年的大片
*/

示例2:A同学被放鸽子,交易失败


public class Demo {
   public static void main(String[] args) {
       Exchanger<String> stringExchanger = new Exchanger<>();

Thread studentA = new Thread(() -> {
           String dataB = null;
           try {
               String dataA = "A同学收藏多年的大片";
               //最多等待5秒
               dataB = stringExchanger.exchange(dataA, 5, TimeUnit.SECONDS);
           } catch (InterruptedException e) {
               e.printStackTrace();
           } catch (TimeoutException ex){
               System.out.println("等待超时-TimeoutException");
           }

System.out.println("A同学得到了" + dataB);
       });

studentA.start();
   }
}

/*
* 输出结果:
* 等待超时-TimeoutException
* A同学得到了null
*/

来源:https://www.cnblogs.com/seve/archive/2021/04/11/14640642.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com