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

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