Java多线程与并发库高级应用之线程数据交换Exchanger

时间:2014-05-01 08:18:46   收藏:0   阅读:455
JDK1.5提供了Exchanger用于两个线程的数据交换。两个线程先后到达交换点,先到达的线程会等待后到达的线程,然后两个线程互相交换数据,交换后双方持对方的数据。

Exchanger只提供了一个构造器:
Exchanger():创建一个新的Exchanger。

Exchanger中也只有两个方法:
V exchange(V x): 等待另一个线程到达此交换点(除非当前线程被中断),然后将给定的对象传送给该线程,并接收该线程的对象。
V exchange(V x, long timeout, TimeUnit unit): 等待另一个线程到达此交换点(除非当前线程被中断,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。

见下面程序
  1. public class ExchangerDemo {  
  2.   
  3.     public static void main(String[] args) {  
  4.           
  5.         //线程池  
  6.         ExecutorService pool = Executors.newCachedThreadPool();  
  7.         //Exchanger  
  8.         final Exchanger<String> changer = new Exchanger<String>();  
  9.           
  10.         //用于交互数据的线程1  
  11.         pool.execute(new Runnable() {  
  12.               
  13.             @Override  
  14.             public void run() {  
  15.                 try{  
  16.                     String data1 = "苹果";  
  17.                     System.out.println(Thread.currentThread().getName() +  
  18.                             "-准备交换数据:" + data1);  
  19.                     Thread.sleep((long)(Math.random()*10000));  
  20.                     String data2 = (String)changer.exchange(data1);  
  21.                     System.out.println(Thread.currentThread().getName() +  
  22.                             "-已交换完数据,交换到的数据:" + data1);  
  23.                 }catch(InterruptedException e){  
  24.                     e.printStackTrace();  
  25.                 }  
  26.             }  
  27.         });  
  28.           
  29.         //用于交互数据的线程2  
  30.         pool.execute(new Runnable() {  
  31.               
  32.             @Override  
  33.             public void run() {  
  34.                 try{  
  35.                     String data1 = "石榴";  
  36.                     System.out.println(Thread.currentThread().getName() +  
  37.                             "-准备交换数据:" + data1);  
  38.                     Thread.sleep((long)(Math.random()*10000));  
  39.                     String data2 = (String)changer.exchange(data1);  
  40.                     System.out.println(Thread.currentThread().getName() +  
  41.                             "-已交换完数据,交换到的数据:" + data1);  
  42.                 }catch(InterruptedException e){  
  43.                     e.printStackTrace();  
  44.                 }  
  45.             }  
  46.         });  
  47.           
  48.         pool.shutdown();  
  49.     }  
  50. }  

运行程序
mamicode.com,码迷
看到两个线程将数据彼此交换。

Java多线程与并发库高级应用之线程数据交换Exchanger,码迷,mamicode.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!