Java中的交换器Exchanger
时间:2020-01-09 10:35:10 来源:igfitidea点击:
作为Java 5中java.util.concurrent包的一部分,添加了许多同步辅助,例如CyclicBarrier,Semaphore。作为Java并发性的一部分添加的另一个同步辅助工具是Exchanger。在本文中,我们将介绍Java中的Exchanger,它如何工作以及Exchanger的示例。
Java并发中的Exchanger
Java中的Exchanger是一种同步辅助工具,有助于在两个线程之间交换数据。当两个线程调用exchange()方法时,将交换这两个线程提供的对象。
Exchanger可用于生产者-消费者方案中,其中生产者线程产生一个缓冲区,该缓冲区可与使用者线程中的空缓冲区交换。
Java Exchanger类构造函数
Exchanger类只有一个构造函数。
- Exchanger()–创建一个新的Exchanger。
Exchanger类中的方法
Java中的Exchanger类只有一个方法exchange(),该方法具有两种重载形式。
- exchange(V x)–等待另一个线程到达此交换点(除非当前线程被中断),然后将给定对象传输到该对象,并返回其对象。
- exchange(V x,long timeout,TimeUnit unit)–等待另一个线程到达此交换点(除非当前线程被中断或者经过了指定的等待时间),然后将给定对象传送给它,并在其中接收其对象返回。
Java Exchanger示例
这是生产者使用者线程的示例,其中线程使用Exchanger交换数据。交换的数据为DataBuffer类型。
数据缓冲区
import java.util.ArrayList; import java.util.List; public class DataBuffer { private List data = new ArrayList<>(); public String getData() { return data.remove(0); } public void addToBuffer(String str) { data.add(str); } public boolean isFull() { if(data.size() == 1) return true; return false; } }
public class ExchangerDemo { public static void main(String[] args) { Exchanger ex = new Exchanger(); // Starting two threads new Thread(new Producer(ex)).start(); new Thread(new Consumer(ex)).start(); } } // Producer class class Producer implements Runnable { Exchanger ex; DataBuffer producerBuffer; Producer(Exchanger ex){ this.ex = ex; } @Override public void run() { DataBuffer producerBuffer = new DataBuffer(); for(int i = 0; i < 3; i ++){ producerBuffer.addToBuffer("Producer" + i); try { if (producerBuffer.isFull()) { // exchange producerBuffer = ex.exchange(producerBuffer); } } catch (InterruptedException e) { System.out.println(e); } } } } // Consumer class class Consumer implements Runnable { Exchanger ex; DataBuffer consumerBuffer; Consumer(Exchanger ex){ this.ex = ex; } @Override public void run() { DataBuffer consumerBuffer = new DataBuffer(); for(int i = 0; i < 3; i ++){ try { System.out.println("waiting..."); consumerBuffer = ex.exchange(consumerBuffer); System.out.println("Received- " + consumerBuffer.getData()); } catch (InterruptedException e) { System.out.println(e); } } } }
输出:
waiting... Received- Producer0 waiting... Received- Producer1 waiting... Received- Producer2