Java并发编程Exchanger Java并发编程之Exchanger方法详解

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Java并发编程Exchanger Java并发编程之Exchanger方法详解

我真的不会Java啊   2021-04-12 我要评论
想了解Java并发编程之Exchanger方法详解的相关内容吗,我真的不会Java啊在本文为您仔细讲解Java并发编程Exchanger的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Java并发编程Exchanger,Java并发编程,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
 */

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们