案例1: 买卖包子, 只能用于两个线程之间,当两个线程之间同时到达时Exchanger(可以类比于包子铺)
发生数据交换,否则等待:
package thread;
import java.util.Random;
import java.util.concurrent.Exchanger;
import java.util.concurrent.TimeUnit;
public class ExchangerDemo {
/**
* Thread-0: 卖包子。。。
Thread-1: 买包子。。。
Thread-0 : 拿到了100元钱
Thread-1 : 拿到了100个包子
*/
public static void main(String[] args) {
final Exchanger<String> exchanger = new Exchanger<String>();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()
+ ": 卖包子。。。");
try {
TimeUnit.SECONDS.sleep(new Random().nextInt(5));
String data1 = "100个包子";
String result = exchanger.exchange(data1);
System.out.println(Thread.currentThread().getName()+ " : 拿到了" + result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()
+ ": 买包子。。。");
try {
TimeUnit.SECONDS.sleep(new Random().nextInt(5));
String data1 = "100元钱";
String result = exchanger.exchange(data1);
System.out.println(Thread.currentThread().getName()+ " : 拿到了" + result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
package cn.itcast.heima2;
import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
线程pool-1-thread-1正在把数据hello换出去
线程pool-1-thread-2正在把数据future换出去
线程pool-1-thread-1换回的数据为future
线程pool-1-thread-2换回的数据为hello
第一个拿出数据的人将一直等到第二个人拿到数据到来时,才彼此交换数据。
* @author zm
*
*/
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 {
String data1 = "hello";
System.out.println("线程" + Thread.currentThread().getName() +
"正在把数据" + data1 +"换出去");
Thread.sleep((long)(Math.random()*10000));// 真实中需要替换成业务, 业务有耗时操作 这里使用沉睡来模拟
String data2 = (String)exchanger.exchange(data1);// 操作完上一行业务后, 甲将自己数据hello 和 乙做交换
System.out.println("线程" + Thread.currentThread().getName() +
"换回的数据为" + data2);
}catch(Exception e){
}
}
});
service.execute(new Runnable(){
public void run() {
try {
String data1 = "future";
System.out.println("线程" + Thread.currentThread().getName() +
"正在把数据" + data1 +"换出去");
Thread.sleep((long)(Math.random()*10000));
String data2 = (String)exchanger.exchange(data1);// 操作完上一行业务后, 乙将自己数据future 和 甲做交换, 当最终那个最慢的人也将数据拿出来后,交换完毕,双方分到需要的数据
System.out.println("线程" + Thread.currentThread().getName() +
"换回的数据为" + data2);
}catch(Exception e){
}
}
});
}
}