java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Exchange 交换器

Java中JUC 的 Exchange 交换器详情

作者:​ Java中文社群   ​

这篇文章主要介绍了Java中JUC 的 Exchange 交换器详情,文章基于Java的相关资料展开详细的内容介绍,需要的小伙伴可以参考一下

前言

Exchange(交换器)顾名思义,它是用来实现两个线程间的数据交换的,它诞生于 JDK 1.5,

它有两个核心方法:

也就是说 exchange 方法就是一个交换点,线程会等待在此交换点,直到有另一个线程也调用了 exchange 方法(相当于进入到了此交换点),这时他们会互换数据,然后执行后续的代码。

基础使用

Exchange 的基础使用如下,我们创建两个线程来模拟“一手交钱、一手交货”的场景,线程 1 先准备好钱进入交换点,然后等待线程 2 在 2s 之后准备好货(物),之后再彼此交互数据,执行后续的流程,

具体实现代码如下:

import java.time.LocalDateTime;
import java.util.concurrent.Exchanger;
public class ExchangeExample {
    // 创建一个交互器
    private final static Exchanger<String> exchange = new Exchanger<>();
    public static void main(String[] args) {
        // 线程 1【准备钱】
        new Thread(() -> {
            System.out.println("线程1:准备筹钱中...| Time:" + LocalDateTime.now());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String moeny = "1000 万";
            System.out.println("线程1:钱准备好了【1000 万】。| Time:" + 
                               LocalDateTime.now());
            try {
                // 执行数据交换【交易】
                String result = exchange.exchange(moeny);
                System.out.println("线程1:交易完成,得到【" + result +
                        "】 | Time:" + LocalDateTime.now());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        // 线程 2【准备货】
        new Thread(() -> {
            System.out.println("线程2:准备物品中【西伯利亚新鲜空气】...| Time:" + 
                               LocalDateTime.now());
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String goods = "西伯利亚新鲜空气";
            System.out.println("线程2:物品准备好了【西伯利亚新鲜空气】。| Time:" + 
                               LocalDateTime.now());
            try {
                // 执行数据交换【交易】
                String result = exchange.exchange(goods);
                System.out.println("线程2:交易完成,得到【" + result +
                        "】 | Time:" + LocalDateTime.now());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
}

以上程序的执行结果如下: 

总结

Exchange 交换器是用来实现两个线程间的数据交换的,Exchanger 可以交互任意数据类型的数据,只要在创建的时候定义泛型类型即可。它的核心方法为 exchange,当线程执行到此方法之后,会休眠等待另一个线程也进入交换点,如果另一个线程也进入了交换点(也执行到了 exchange 方法),此时二者会交换数据,并执行后续的流程。

到此这篇关于Java中JUC 的 Exchange 交换器详情的文章就介绍到这了,更多相关Exchange 交换器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文