java并发核心二Exchanger的使用

Posted 快乐菠菜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java并发核心二Exchanger的使用相关的知识,希望对你有一定的参考价值。

类 Exchanger 的功能可以使2个线程之间传输数据,比生产者/消费者模式方便。

Exchanger类的结构很简单,重点就是exchange()方法。

exchange()方法是阻塞执行的,可以设置超时时间,调用不同的api即可。

exchange 的 英文意思就是交换,而对于线程而言也是这样的,就是两个线程交换信息。如果共有3个线程,且3个线程同时调用了exchange,那么就会有一个线程没有交换信息的对象,就会继续阻塞。

下面是一个例子:

共有两个类 ExchangerThread、ExchangerTest:

package com.cd.concurrent.exchanger;

import java.util.concurrent.Exchanger;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

public class ExchangerThread extends Thread {
    private Exchanger<String> exchanger;

    private String name;

    public ExchangerThread(String name, Exchanger<String> exchanger) {
        super();
        this.name = name;
        this.exchanger = exchanger;
    }

    @Override
    public void run() {
        try {
            //            System.out.println("线程[" + name + "]拿到消息:" + exchanger.exchange(name + "-msg"));  // 不设置超时时间,线程会一直阻塞等待
            System.out.println("线程[" + name + "]拿到消息:" + exchanger.exchange(name + "-msg", 5, TimeUnit.SECONDS)); // 设置5秒的超时时间
            System.out.println("线程[" + name + "]over");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
package com.cd.concurrent.exchanger;

import java.util.concurrent.Exchanger;

public class ExchangerTest {

    public static void main(String[] args) {
        Exchanger<String> exchanger = new Exchanger<String>();
        ExchangerThread t1 = new ExchangerThread("t1", exchanger);
        ExchangerThread t2 = new ExchangerThread("t2", exchanger);
        ExchangerThread t3 = new ExchangerThread("t3", exchanger);
        t1.start();
        t2.start();
        t3.start();
    }

}

运行结果:

 

以上是关于java并发核心二Exchanger的使用的主要内容,如果未能解决你的问题,请参考以下文章

Java并发编程原理与实战二十九:Exchanger

一行Java代码实现两玩家交换装备并发编程

一行Java代码实现两玩家交换装备并发编程

java并发Exchanger的使用

[笔记][Java7并发编程实战手冊]3.8 并发任务间的数据交换Exchanger

java并发线程同步工具Exchanger的使用