Exchanger两个线程之间交换数据

来源:互联网 发布:重庆seo网络优化 编辑:程序博客网 时间:2024/05/16 15:54

        类java.util.concurrent.Exchanger 提供了一个同步点,在这个同步点,一对线程可以交换数据。每个线程通过exchange()方法的入口提供数据给他的伙伴线程,并接收他的伙伴线程提供的数据,并返回。以下附上测试DEMO。

import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import java.util.List;import java.util.concurrent.Exchanger;/** * 两个线程之间进行数据交换 * @author li * */public class ExchangerDemo {private static final Exchanger<List<Object>> exc=new Exchanger<List<Object>>();public static void main(String[] args) {new Thread(new DataProducer()).start();new Thread(new DataConsumer()).start();}/** * 生成者 * @author li * */ static class DataProducer implements Runnable{private List<Object> list=new ArrayList<Object>();@Overridepublic void run() {          for(int i=0;i<5;i++){          System.out.println(Thread.currentThread().getId()+":生产一个数据耗时一秒");          list.add(new Date());          try {Thread.sleep(1000);} catch (InterruptedException e) {               //IG}          }         try {        System.out.println(Thread.currentThread().getId()+"交换。。。。。。start");list =exc.exchange(list);//阻塞等待交换System.out.println(Thread.currentThread().getId()+"交换。。。。。。end");} catch (InterruptedException e) {            //IG}        for(Iterator<Object> it=list.iterator();it.hasNext();){         System.out.println("Producer:"+it.next());         }}}/** * 消费者 * @author li * */ staticclass DataConsumer implements Runnable{private List<Object> list=new ArrayList<Object>();@Overridepublic void run() {for(int i=0;i<5;i++){System.out.println(Thread.currentThread().getId()+":写白条");list.add("这是一个收条");}try {  System.out.println(Thread.currentThread().getId()+"交换。。。。。。start");  list =exc.exchange(list);  System.out.println(Thread.currentThread().getId()+"交换。。。。。。end");} catch (InterruptedException e) {            //IG}for(Iterator<Object> it=list.iterator();it.hasNext();){Date date=(Date)it.next();         System.out.println("Consumer:"+date);         }}}}
运行结果:

8:生产一个数据耗时一秒9:写白条9:写白条9:写白条9:写白条9:写白条9交换。。。。。。start8:生产一个数据耗时一秒8:生产一个数据耗时一秒8:生产一个数据耗时一秒8:生产一个数据耗时一秒8交换。。。。。。start9交换。。。。。。end8交换。。。。。。endProducer:这是一个收条Producer:这是一个收条Producer:这是一个收条Producer:这是一个收条Producer:这是一个收条Consumer:Fri Aug 14 10:38:42 CST 2015Consumer:Fri Aug 14 10:38:43 CST 2015Consumer:Fri Aug 14 10:38:44 CST 2015Consumer:Fri Aug 14 10:38:45 CST 2015Consumer:Fri Aug 14 10:38:46 CST 2015



0 0
原创粉丝点击