美文网首页
线程间数据交换 - Exchanger

线程间数据交换 - Exchanger

作者: zbsong | 来源:发表于2020-07-06 19:16 被阅读0次

什么是Exchanger?

线程间协作的一个工具类,简单点说就是两个线程之间交换数据,两个线程之间通过exchanger方法交换数据,当第一个线程执行了exchanger方法后,会一直等待第二个线程执行exchanger,当第二个线程也执行了exchanger方法(两个线程都到达交换点),两个线程就可以传递数据,将本线程产生的数据传输给对方。

构造

Exchanger() 创建一个数据交换机

Exchanger方法

类型 方法 描述
V exchange(V x) 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传输给它,然后接收它的对象作为返回
V exchange(V x, long timeout, TimeUnit unit) 等待另一个线程到达此交换点(除非当前线程被中断或指定的等待时间已过),然后将给定对象传输给它,并接收其对象作为返回

例子

package com.sy.thread.example;

import java.util.concurrent.Exchanger;

/**
 * Description: thread
 *
 * @author songyu
 */
public class ExchangerTest {
    //声明一个交换机,交换类型是String类型
    static Exchanger<String> exchanger = new Exchanger<String>();

    public static void main(String[] args) {
        new Thread(()->{
            String exchangerContent = "您好,我是线程1";
            try{
                //阻塞,等待第二个线程到的交换点
                exchangerContent = exchanger.exchange(exchangerContent);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "接收到的内容:" + exchangerContent);
        },"线程一").start();

        new Thread(()->{
            String exchangerContent = "你好,我是线程2";
            try{
                exchangerContent = exchanger.exchange(exchangerContent);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "接收到的内容:" + exchangerContent);
        },"线程二").start();
    }
}


执行结果

线程二接收到的内容:您好,我是线程1
线程一接收到的内容:你好,我是线程2

通过运行结果可以看到各自线程内定义的内容已经实现了在两个线程之间交换。

相关文章

网友评论

      本文标题:线程间数据交换 - Exchanger

      本文链接:https://www.haomeiwen.com/subject/kplgqktx.html