您的位置:首页 > 其它

Exchanger 实现两个伙伴线程之间的数据交互

2013-01-25 11:59 609 查看
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() ;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐