【并发编程】- 使用Exchanger线程间传输数据

89 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

Exchanger

类Exchanger的作用是让2个线程之间传输数据,它比生产者、消费者模式使用的wait/notify更加方便。

在2个线程之间传递任意数据类型的数据。

方法exchange()阻塞的特性

类Exchanger中的exchange()方法具有阻塞性,调用方法后等待其他线程来获取数据,如果没有其他线程获取数据,则一直阻塞等待。

创建GetThread线程代码如下:

public class GetThread implements Runnable{

    private Exchanger<String> exchanger;

    public GetThread(Exchanger<String> exchanger){
        super();
        this.exchanger=exchanger;
    }

    @Override
    public void run() {
        try {
            System.out.println("在线程getThread中获取线程setThread的值为 "+ exchanger.exchange("setThread"));
            System.out.println("线程getThread结束!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

运行类代码如下:

public class ExchangerRun {
    public static void main(String[] args) {
        Exchanger<String> exchanger = new Exchanger<>();
        GetThread getThread = new GetThread(exchanger);
        new Thread(getThread).start();
        System.out.println("主进程结束!");
    }
}

程序运行结果如下:

Connected to the target VM, address: '127.0.0.1:55200', transport: 'socket'
主进程结束!

创建SetThread线程代码如下:

public class SetThread implements Runnable{

    private Exchanger<String> exchanger;

    public SetThread(Exchanger<String> exchanger){
        super();
        this.exchanger=exchanger;
    }

    @Override
    public void run() {
        try {
            System.out.println("在线程setThread中获取线程getThread的值为 "+ exchanger.exchange("getThread"));
            System.out.println("线程setThread结束!");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

运行类代码如下:

public class ExchangerRun {
    public static void main(String[] args) {
        Exchanger<String> exchanger = new Exchanger<>();
        GetThread getThread = new GetThread(exchanger);
        SetThread setThread = new SetThread(exchanger);
        new Thread(getThread).start();
        new Thread(setThread).start();
    }
}

程序运行结果如下:

在线程getThread中获取线程setThread的值为 getThread
在线程setThread中获取线程getThread的值为 setThread
线程setThread结束!
线程getThread结束!
方法exchange(V x,long timeout,TimeUnit unit)设置超时

创建GetThread调用exchange()方法设置超时时间代码如下:

public class GetThread implements Runnable{

    private Exchanger<String> exchanger;

    public GetThread(Exchanger<String> exchanger){
        super();
        this.exchanger=exchanger;
    }

    @Override
    public void run() {
        try {
            System.out.println("在线程getThread中获取线程setThread的值为 "+ exchanger.exchange("setThread",5, TimeUnit.SECONDS));
            System.out.println("线程getThread结束!");
        } catch (InterruptedException | TimeoutException e) {
            e.printStackTrace();
        }
    }
}