029 线程辅助类---Exchanger

一 . 概述

  该类描述的是一个交换空间,我们可以理解为我们的生产者和消费者模型之中的缓冲区.


二 . 类结构

  构造方法:   

public Exchanger()

这个类的构造需要一个泛型,表示需要交换的数据.

exchange()交换数据.

当传入null的时候表示从缓冲区中获取数据.


三 . 例子

我们模拟一个生产者和消费者的模型

public class ExchangerTest {
    public static void main(String[] args) throws Exception {
        final Exchanger<Integer> exchange = new Exchanger<Integer>();
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(;;)
                try {
                    exchange.exchange(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
        
        new Thread(new Runnable() {
            @Override
            public void run() {
                for(;;)
                try {
                    System.out.println(exchange.exchange(null));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

注意,我们获取数据的时候只需要传入一个null就能完成任务.


四 . 理解

  我们可以将交换空间理解为生产者和消费者模型之中的缓冲区,利用这个缓冲区的概念我们能够实现线程之间的数据交换,实际上着也是一种同步的方式.

  因为当交换空间没有数据的时候,就会阻塞那个获取线程的线程,因此这个也算一个实现线程同步的方式.

原文地址:https://www.cnblogs.com/trekxu/p/9011355.html