两个线程可以交换对象的同步点。每个线程都在进入 exchange
方法时给出某个对象,并接受其他线程返回时给出的对象。
用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人将一直等待第二个人拿着数据到来时,才能彼此交换数据。
构造方法摘要 |
---|
**[Exchanger](http://www.cnblogs.com/java/util/concurrent/Exchanger.html#Exchanger())**() 创建一个新的 Exchanger。 |
方法摘要 | |
---|---|
[V](http://www.cnblogs.com/java/util/concurrent/Exchanger.html "Exchanger 中的类型参数") |
**[exchange](http://www.cnblogs.com/java/util/concurrent/Exchanger.html#exchange(V))**([V](http://www.cnblogs.com/java/util/concurrent/Exchanger.html
"Exchanger 中的类型参数") x) 等待另一个线程到达此交换点(除非它被 中断 )),然后将给定的对象传送给该线程,并接收该线程的对象。
|
[V](http://www.cnblogs.com/java/util/concurrent/Exchanger.html "Exchanger 中的类型参数") |
**[exchange](http://www.cnblogs.com/java/util/concurrent/Exchanger.html#exchange(V,
long,
java.util.concurrent.TimeUnit))**([V](http://www.cnblogs.com/java/util/concurrent/Exchanger.html
"Exchanger 中的类型参数") x, long timeout,
[TimeUnit](http://www.cnblogs.com/java/util/concurrent/TimeUnit.html
"java.util.concurrent 中的枚举") 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