首页 > 代码库 > java线程中Exchanger使用

java线程中Exchanger使用

有时我们需要对元素进行配对和交换线程的同步点,使用exchange方法 返回其伙伴的对象,这时我们就需要使用线程类中的Exchanger类了,

我通过一个实例 来简单说明一下他的使用方法及其作用:

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. import java.util.concurrent.Exchanger;  
  2. import java.util.concurrent.ExecutorService;  
  3. import java.util.concurrent.Executors;  
  4.   
  5.   
  6. public class TestExchanger {  
  7.   
  8.     /** 
  9.      * @param args 
  10.      */  
  11.     public static void main(String[] args) {  
  12.          ExecutorService executor = Executors.newCachedThreadPool();  
  13.          final Exchanger<String> exchanger = new Exchanger<String>();  
  14.          executor.execute(new Runnable() {  
  15.             String data1 = "abc";  
  16.             @Override  
  17.             public void run() {  
  18.                 try {  
  19.                     System.out.println(Thread.currentThread().getName() +"正在把数据 "+ data1+ " 交换出去" );  
  20.                     Thread.sleep((long) (Math.random()*1000));  
  21.                       
  22.                     String data2 = (String) exchanger.exchange(data1);  
  23.                     System.out.println(Thread.currentThread().getName() + "交换数据 到  "+ data2);  
  24.                 } catch (InterruptedException e) {  
  25.                     e.printStackTrace();  
  26.                 }  
  27.             }  
  28.         });  
  29.            
  30.          executor.execute(new Runnable() {  
  31.              String data1 = "def";  
  32.             @Override  
  33.             public void run() {  
  34.                 try {  
  35.                     System.out.println(Thread.currentThread().getName() +"正在把数据 "+ data1+ " 交换出去" );  
  36.                     Thread.sleep((long) (Math.random()*1000));  
  37.                       
  38.                     String data2 = (String) exchanger.exchange(data1);  
  39.                     System.out.println(Thread.currentThread().getName() + "交换数据 到  "+ data2);  
  40.                 } catch (InterruptedException e) {  
  41.                     e.printStackTrace();  
  42.                 }  
  43.             }  
  44.         });  
  45.     }  
  46.   
  47. }  

执行完毕之后;你会发现数据完成交换

pool-1-thread-1正在把数据 abc 交换出去
pool-1-thread-2正在把数据 def 交换出去
pool-1-thread-2交换数据 到  abc
pool-1-thread-1交换数据 到  def

java线程中Exchanger使用