java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java中的Exchanger

Java并发编程中的Exchanger解析

作者:MC-闰土

这篇文章主要介绍了Java并发编程中的Exchanger解析,Exchanger用于线程间数据的交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据,这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,需要的朋友可以参考下

概述

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

Exchanger 可被视为 SynchronousQueue 的双向形式。Exchanger在遗传算法和管道设计等应用中很有用。

内存一致性:对于通过 Exchanger 成功交换对象的每对线程,每个线程中在 exchange() 之前的操作 happen-before 从另一线程中相应的 exchange() 返回的后续操作。

方法

提供的方法:

    // 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
    public V exchange(V x) throws InterruptedException
    //增加超时机制,超过指定时间,抛TimeoutException异常
    public V exchange(V x, long timeout, TimeUnit unit) throws InterruptedException, TimeoutException

使用示例

该类使用 Exchanger 在线程间交换缓冲区,因此,在需要时,填充缓冲区的线程获取一个新腾空的缓冲区,并将填满的缓冲区传递给清空缓冲区的线程。

class FillAndEmpty {
    Exchanger<DataBuffer> exchanger = new Exchanger<DataBuffer>();
    DataBuffer initialEmptyBuffer = ... a made-up type
    DataBuffer initialFullBuffer = ...
    
    //填充缓冲区线程
    class FillingLoop implements Runnable {
        public void run() {
            DataBuffer currentBuffer = initialEmptyBuffer;    //空的缓冲区
            try {
                while (currentBuffer != null) {
                    addToBuffer(currentBuffer);    //填充数据
                    //如果缓冲区被数据填满,执行exchange。等待清空缓冲区线程也执行exchange方法。当两个线程都到达同步点,交换数据。
                    if (currentBuffer.isFull())
                        currentBuffer = exchanger.exchange(currentBuffer);    
                }
            } catch (InterruptedException ex) { ... handle ... }
        }
    }
    
    //清空缓冲区线程
    class EmptyingLoop implements Runnable {
        public void run() {
            DataBuffer currentBuffer = initialFullBuffer;    //满的缓冲区
            try {
                while (currentBuffer != null) {
                    takeFromBuffer(currentBuffer);    //清空缓冲区
                    //如果缓冲区被清空,执行exchange。等待填充缓冲区线程也执行exchange方法。当两个线程都到达同步点,交换数据。
                    if (currentBuffer.isEmpty())
                        currentBuffer = exchanger.exchange(currentBuffer);
                }
            } catch (InterruptedException ex) { ... handle ...}
        }
    }
 
    void start() {
        new Thread(new FillingLoop()).start();
        new Thread(new EmptyingLoop()).start();
    }
}

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

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