Exchanger可以实现两个线程之间的数据交换,每个线程在完成一定的事务后想与对方交换数据,一个先拿出数据的线程将一直等待第二个线程拿着数据到来时,才能彼此交换数据。

通过代码看一下Exchanger的执行效果

  • 1-1 一个Exchanger线程交换数据的例子
  1. import java.util.concurrent.Exchanger; 
  2. import java.util.concurrent.ExecutorService; 
  3. import java.util.concurrent.Executors; 
  4.  
  5. public class ExchangerTest { 
  6.  
  7.     public static void main(String[] args) { 
  8.         ExecutorService service = Executors.newCachedThreadPool(); 
  9.         final Exchanger<String> exchanger = new Exchanger<String>(); 
  10.         service.execute(new Runnable(){//启动一个线程 
  11.             public void run() { 
  12.                 try {                
  13.                     String data1 = "zxx"
  14.                     System.out.println("线程" + Thread.currentThread().getName() +  
  15.                     "正在把数据" + data1 +"换出去"); 
  16.                     Thread.sleep((long)(Math.random()*10000));//在交换数据之前,随机等待一段时间 
  17.                     String data2 = (String)exchanger.exchange(data1);//先到的线程等到后到的 
  18.                     System.out.println("线程" + Thread.currentThread().getName() +  
  19.                     "换回的数据为" + data2); 
  20.                 }catch(Exception e){ 
  21.                 } 
  22.             }    
  23.         }); 
  24.         service.execute(new Runnable(){//另外一个线程 
  25.             public void run() { 
  26.                 try {                
  27.  
  28.                     String data1 = "lhm"
  29.                     System.out.println("线程" + Thread.currentThread().getName() +  
  30.                     "正在把数据" + data1 +"换出去"); 
  31.                     Thread.sleep((long)(Math.random()*10000));//在交换数据之前,随机等待一段时间                     
  32.                     String data2 = (String)exchanger.exchange(data1);//两个线程都到时,操开始交换数据 
  33.                     System.out.println("线程" + Thread.currentThread().getName() +  
  34.                     "换回的数据为" + data2); 
  35.                 }catch(Exception e){ 
  36.                 }                
  37.             }    
  38.         });      
  39.     } 

程序的运行效果如下:

同步工具之Exchanger实现线程间的数据交换_java