1. 交换器
交换器提供了一个线程彼此之间能够交换对象的同步点。
泛型类java.util.concurrent.Exchanger<V>实现了交换器。
Exchanger<V>类中的主要方法就是:exchange(V x)方法,成对的两个线程之间,都调用了该方法,就能在两个线程彼此都准备好数据后,成功的交换数据给对方,然后各自返回。如果想支持成对的两个线程之间,一个没耐性,等的时间过长,或者被打断了就不交换数据了,可以使用exchange(V x, long timeout, TimeUnit unit)方法。
2.常用方法
(1)Exchanger()构造函数
初始化一个交换器
(2)V exchange(V x)
在这个交互点上等待其他线程到达(除非调用线程被中断了),之后将所给对象传入其中,接收其他线程的对象作为返回。
(3)V exchange(V x, long timeout, TimeUnit unit)
指定调用线程愿意等待的时长,剩下的和上一个方法相同。
3. 示例
import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ExchangeTest {
public static void main(String[] args)
{
final Exchanger<String> exchanger = new Exchanger<String>();
Runnable rcat = new Runnable() {
@Override
public void run()
{
try {
String data1 = "小鱼干";
String name = Thread.currentThread().getName();
System.out.println(name + "正在把食物" + data1 + "交换出去。" );
Thread.sleep((long)(Math.random()*1000));
String data2 = (String)exchanger.exchange(data1);
System.out.println(name + "交换回来的食物为:" + data2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
Runnable rdog = new Runnable() {
@Override
public void run()
{
try {
String data1 = "小骨头";
String name = Thread.currentThread().getName();
System.out.println(name + "正在把食物" + data1 + "交换出去。" );
Thread.sleep((long)(Math.random()*1000));
String data2 = (String)exchanger.exchange(data1);
System.out.println(name + "交换回来的食物为:" + data2);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.submit(rcat);
executorService.submit(rdog);
try {
Thread.sleep(2000); //模拟交换的过程
System.out.println("交换完成!");
executorService.shutdown();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
pool-1-thread-1正在把食物小鱼干交换出去。
pool-1-thread-2正在把食物小骨头交换出去。
pool-1-thread-2交换回来的食物为:小鱼干
pool-1-thread-1交换回来的食物为:小骨头
交换完成!