java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Exchanger线程间交换数据

Java并发工具之Exchanger线程间交换数据详解

作者:warybee

这篇文章主要介绍了Java并发工具之Exchanger线程间交换数据详解,Exchanger是一个用于线程间协作的工具类,Exchanger用于进行线程间的数据交 换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据,需要的朋友可以参考下

Exchanger简介

Exchanger是一个用于线程间协作的工具类。

Exchanger用于进行线程间的数据交 换。

它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。

这两个线程通过 exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也 执行exchange()方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产 出来的数据传递给对方

在这里插入图片描述

Exchanger使用介绍

Exchanger<T>用于在两个线程之间共享数据。该类仅提供一个重载方法exchange(T t),其中exchange(V x, long timeout, TimeUnit unit)方法可以指定阻塞超时时间,下面通过一个来理解两个线程之间交换数据:

public class ExchangerDemo {
    static Exchanger<String> exgr = new Exchanger<>();
    public static void main(String[] args) {
         Thread taskA=new Thread(()->{
             try {
                 String message = exgr.exchange("from A");
                 System.out.println("A Task===>"+ message);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
         });
        Thread taskB=new Thread(()->{
            try {
                String message = exgr.exchange("from B");
                System.out.println("B Task===>"+ message);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        taskA.start();
        taskB.start();

    }
}

输出结果:

线程A,把数据传给了线程B,线程B,把数据传给了线程A

B Task===>from A
A Task===>from B

子线程与主线程间交换数据

public class ExchangerDemo2 {
    static Exchanger<String> exchanger = new Exchanger<>();
    public static void main(String[] args) throws InterruptedException {
        Runnable childTask = () -> {
            try {
                String message = exchanger.exchange("来自子线程的数据");
                System.out.println("子线程: "+message);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                throw new RuntimeException(e);
            }
        };
        //CompletableFuture java1.8中新增的异步编程类
        CompletableFuture<Void> result = CompletableFuture.runAsync(childTask);
        String msg = exchanger.exchange(" 来自主线程的数据");
        System.out.println("主线程: " +msg);
        result.join();
    }
}

输出结果:

子线程:  来自主线程的数据
主线程: 来自子线程的数据

到此这篇关于Java并发工具之Exchanger线程间交换数据详解的文章就介绍到这了,更多相关Exchanger线程间交换数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

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