您的位置:首页 > 编程语言 > Java开发

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

2013-12-20 01:12 585 查看
JDK1.5提供了Exchanger用于两个线程的数据交换。两个线程先后到达交换点,先到达的线程会等待后到达的线程,然后两个线程互相交换数据,交换后双方持对方的数据。

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

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

见下面程序
public class ExchangerDemo {

public static void main(String[] args) {

//线程池
ExecutorService pool = Executors.newCachedThreadPool();
//Exchanger
final Exchanger<String> changer = new Exchanger<String>();

//用于交互数据的线程1
pool.execute(new Runnable() {

@Override
public void run() {
try{
String data1 = "苹果";
System.out.println(Thread.currentThread().getName() +
"-准备交换数据:" + data1);
Thread.sleep((long)(Math.random()*10000));
String data2 = (String)changer.exchange(data1);
System.out.println(Thread.currentThread().getName() +
"-已交换完数据,交换到的数据:" + data1);
}catch(InterruptedException e){
e.printStackTrace();
}
}
});

//用于交互数据的线程2
pool.execute(new Runnable() {

@Override
public void run() {
try{
String data1 = "石榴";
System.out.println(Thread.currentThread().getName() +
"-准备交换数据:" + data1);
Thread.sleep((long)(Math.random()*10000));
String data2 = (String)changer.exchange(data1);
System.out.println(Thread.currentThread().getName() +
"-已交换完数据,交换到的数据:" + data1);
}catch(InterruptedException e){
e.printStackTrace();
}
}
});

pool.shutdown();
}
}


运行程序



看到两个线程将数据彼此交换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: