软件编程
位置:首页>> 软件编程>> java编程>> Java中JUC 的 Exchange 交换器详情

Java中JUC 的 Exchange 交换器详情

作者:??Java中文社群????  发布时间:2023-09-17 18:46:40 

标签:Java,JUC,Exchange,交换器

前言

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

它有两个核心方法:

  • exchange(V x):等待另一个线程到达此交换点,然后将对象传输给另一个线程,并从另一个线程中得到交换的对象。如果另一个线程未到达此交换点,那么此线程会一直休眠(除非遇了线程中断)。

  • exchange(V x, long timeout, TimeUnit unit):等待另一个线程到达此交换点,然后将对象传输给另一个线程,并从另一个线程中得到交换的对象。如果另一个线程未到达此交换点,那么此线程会一直休眠,直到遇了线程中断,或等待的时间超过了设定的时间,那么它会抛出异常。

也就是说 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();
   }
}

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

Java中JUC 的 Exchange 交换器详情

来源:https://juejin.cn/post/7098968690661523492

0
投稿

猜你喜欢

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