Java多线程之Exchanger(一)

来源:互联网 发布:西安朝阳软件 编辑:程序博客网 时间:2024/05/22 03:40

在Java中,Exchanger用于线程之间将数据换出去String data2 = (String)exchanger.exchange(data1);,这个当然也是线程阻塞的,

只要有另外一个线程(同个线程也可以)也换出数据。这时两个线程之间就可以互换数据了。当然线程之间谁先换出数据是无关紧要的,

因为换数据操作是阻塞的,只有等到两个线程都换出数据了,才能取得换回数据。

package three.day.thread;


import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;


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 = "thread-a";
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 = "thread-b";
System.out.println("线程" + Thread.currentThread().getName() + 
"正在把数据" + data1 +"换出去");
String data2 = (String)exchanger.exchange(data1);
System.out.println("线程" + Thread.currentThread().getName() + 
"换回的数据为" + data2);
}catch(Exception e){

}
}
});
service.shutdown();
}


}