练习题之ExChange
两个线程可以交换对象的同步点。每个线程都在进入exChange方法时给出某个对象,并接受其他线程返回时给出的对象。用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人将一直等待第二个人拿着数据到来时,才能彼此交换数据。
构造方法摘要 | |
---|---|
Exchanger() 创建一个新的 Exchanger。 |
方法摘要 | |
---|---|
V |
exchange(V x) 等待另一个线程到达此交换点(除非它被中断 ),然后将给定的对象传送给该线程,并接收该线程的对象。 |
V |
exchange(V x, long timeout, TimeUnit unit) 等待另一个线程到达此交换点(除非它被中断 ,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。 |
public class ExchangerTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); final Exchanger exchanger = new Exchanger(); service.execute(new Runnable(){ public void run() { try { Thread.sleep((long)(Math.random()*10000)); String data1 = "zxx"; System.out.println("线程" + Thread.currentThread().getName() + "正在把数据" + data1 +"换出去"); String data2 = (String)exchanger.exchange(data1); System.out.println("线程" + Thread.currentThread().getName() + "换回的数据为" + data2); }catch(Exception e){ } } }); service.execute(new Runnable(){ public void run() { try { Thread.sleep((long)(Math.random()*10000)); String data1 = "lhm"; System.out.println("线程" + Thread.currentThread().getName() + "正在把数据" + data1 +"换出去"); String data2 = (String)exchanger.exchange(data1); System.out.println("线程" + Thread.currentThread().getName() + "换回的数据为" + data2); }catch(Exception e){ } } }); } }
运行结果如下:
线程pool-1-thread-1正在把数据zxx换出去
线程pool-1-thread-2正在把数据lhm换出去
线程pool-1-thread-1换回的数据为lhm
线程pool-1-thread-2换回的数据为zxx