Java Exchanger示例
时间:2020-02-23 14:35:00 来源:igfitidea点击:
Exchanger类使用Java 1.5引入其他类,此类ConcurrentHashMap,CountDownLatch,信号量。
Exchanger类用于在两个线程之间交换对象。
交换机只是等待直到两个单独的线程呼叫Exchange方法,当它发生时,它会交换线程提供的数据.TWO线程可以对并交换它们之间的对象。
交换机类可用于遗传算法或者管道设计。
它有两个超载版本的Exchange方法。
- Exchange(v x):等待另一个线程到达与该线程的交换点和Exchange对象。
- Exchange(v x,long超时,时间单位):它等待另一个线程,以便在方法中提供的特定时间间隔和与该线程的Exchange对象提供。
让我们用榜样来理解:
我们有两个线程,例如:生产者和消费者,他们将交换国家对象。
生产者将创建国家对象和消费者将返回伪域的对象。
让我们首先创建国家程序。
它只需一个名为countryname的属性。
package org.igi.theitroad; public class Country { private String countryName; public Country(String countryName) { super(); this.countryName = countryName; } public String getCountryName() { return countryName; } }
现在我们将创建名为exchangerexamplemplemain.java的主类,它将有另外两个名为Producer和Cofferer的类,它将实现可追加的接口。
package org.igi.theitroad; import java.util.concurrent.Exchanger; public class ExchangerExampleMain { public static void main(String[] args) { Exchanger exchanger = new Exchanger(); //Starting two threads new Thread(new Producer(exchanger)).start(); new Thread(new Consumer(exchanger)).start(); } } class Producer implements Runnable { Exchanger ex; Producer(Exchanger ex){ this.ex = ex; } @Override public void run() { for(int i = 0; i < 2; i ++){ Country country=null ; if(i==0) country =new Country("Netherlands"); else country =new Country("Bhutan"); try { //exchanging with an dummy Country object Country dummyCountry = ex.exchange(country); System.out.println("Got country object from Consumer thread : "+dummyCountry.getCountryName()); } catch (InterruptedException e) { System.out.println(e); } } } } class Consumer implements Runnable { Exchanger ex; Consumer(Exchanger ex){ this.ex = ex; } @Override public void run() { for(int i = 0; i < 2; i ++){ try { //Getting Country object from producer thread //giving dummy country object in return Country country = ex.exchange(new Country("Dummy")); System.out.println("Got country object from Producer thread : "+country.getCountryName()); } catch (InterruptedException e) { System.out.println(e); } } } }
运行上面的程序时,我们将得到以下输出。
Got country object from Consumer thread : Dummy Got country object from Producer thread : Netherlands Got country object from Consumer thread : Dummy Got country object from Producer thread : Bhutan
如果我们注意到,制片人已与消费者交换了两个国家对象(荷兰和不丹),并换了伪域对象。
如果我们想了解更加现实的交易所。
生产者和消费者可以交换缓冲区。
当缓冲区已满时,生产者将为消费者提供完整的缓冲区,消费者将返回空缓冲区返回。