Exchanger的使用
两个线程可以交换对象的同步点。每个线程都在进入 exchange
方法时给出某个对象,并接受其他线程返回时给出的对象。
用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人将一直等待第二个人拿着数据到来时,才能彼此交换数据。
构造方法摘要 | |
---|---|
Exchanger() 创建一个新的 Exchanger。 |
方法摘要 | |
---|---|
V |
exchange(V x) 等待另一个线程到达此交换点(除非它被 中断 ),然后将给定的对象传送给该线程,并接收该线程的对象。 |
V |
exchange(V x, long timeout, TimeUnit unit) 等待另一个线程到达此交换点(除非它被 中断 ,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。 |
1 package com.thread; 2 import java.util.concurrent.Exchanger; 3 import java.util.concurrent.ExecutorService; 4 import java.util.concurrent.Executors; 5 6 public class ExchangerTest { 7 8 public static void main(String[] args) { 9 ExecutorService service = Executors.newCachedThreadPool(); 10 final Exchanger exchanger = new Exchanger(); 11 service.execute(new Runnable(){ 12 public void run() { 13 try { 14 Thread.sleep((long)(Math.random()*10000)); 15 String data1 = "zxx"; 16 System.out.println("线程" + Thread.currentThread().getName() + 17 "正在把数据" + data1 +"换出去"); 18 String data2 = (String)exchanger.exchange(data1); 19 System.out.println("线程" + Thread.currentThread().getName() + 20 "换回的数据为" + data2); 21 }catch(Exception e){ 22 23 } 24 } 25 }); 26 service.execute(new Runnable(){ 27 public void run() { 28 try { 29 Thread.sleep((long)(Math.random()*10000)); 30 String data1 = "lhm"; 31 System.out.println("线程" + Thread.currentThread().getName() + 32 "正在把数据" + data1 +"换出去"); 33 String data2 = (String)exchanger.exchange(data1); 34 System.out.println("线程" + Thread.currentThread().getName() + 35 "换回的数据为" + data2); 36 }catch(Exception e){ 37 38 } 39 } 40 }); 41 } 42 }
运行结果如下:
线程pool-1-thread-1正在把数据zxx换出去 线程pool-1-thread-2正在把数据lhm换出去 线程pool-1-thread-1换回的数据为lhm 线程pool-1-thread-2换回的数据为zxx
我喜欢,驾驭着代码在风驰电掣中创造完美!我喜欢,操纵着代码在随必所欲中体验生活!我喜欢,书写着代码在时代浪潮中完成经典!每一段新的代码在我手中诞生对我来说就象观看刹那花开的感动!