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
如果我们注意到,制片人已与消费者交换了两个国家对象(荷兰和不丹),并换了伪域对象。
如果我们想了解更加现实的交易所。
生产者和消费者可以交换缓冲区。
当缓冲区已满时,生产者将为消费者提供完整的缓冲区,消费者将返回空缓冲区返回。

