package thread;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.Exchanger;
/**
* 下面的例子模拟生产者生产物品 后 与消费者交换数据
* @author zhoufeng
*
*/
public class ExchangeDemo {
/* 如果两条线程要交换的类型是一样的 就可以为 Exchanger 加上泛型,如果不是一样的就不要加泛型 */
private final Exchanger exg = new Exchanger() ;
private class Producer implements Runnable{
List<String> list = new LinkedList<String>();
public void run() {
try {
for (int i = 0; i < 5 ; i++) {
String str = "producer 生产第" + i + "条数据" ;
list.add(str) ;
}
System.out.println("producer 生产完毕,等待交换数据...");
String result = (String)exg.exchange(list) ; //交换数据
System.out.println("producer 等待交换数据完成...");
// 打印消费者线程返回的消息
System.out.println("print by producer : 收到" + result);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/* 消费者 */
private class Customer implements Runnable{
List<String> list = new LinkedList<String>();
public void run() {
try {
Thread.sleep(5000) ; //睡眠5s 。模拟赚钱
System.out.println("customer 生产完毕,等待交换数据...");
list = (List)exg.exchange("5000¥") ; //交换数据
System.out.println("customer 等待交换数据完成...");
for (String s : list) {
System.out.println("print by customer : " + s);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
ExchangeDemo ed = new ExchangeDemo();
new Thread(ed.new Producer()).start() ;
new Thread(ed.new Customer()).start() ;
}
}
Exchanger 实现两个伙伴线程之间的数据交互
最新推荐文章于 2024-08-17 10:45:00 发布