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
- Exchanger两个线程之间交换数据
- Exchanger两个线程之间的数据交换
- exchanger 线程之间交换数据
- Exchanger: 两个线程 间 交换 数据
- 两个线程进行数据交换的Exchanger
- jdk5 Exchanger 线程之间数据交换
- jdk5 Exchanger 线程之间数据交换
- Exchanger:线程交换数据
- java多线程-Thread两个线程交换数据Exchanger
- Java多线程之~~~使用Exchanger在线程之间交换数据
- 黑马程序员-Condition条件对象、Semaphore、CyclicBarrier、倒计时门栓 CountDownLatch、Exchanger(实现两个线程之间数据交换
- Exchanger 实现两个伙伴线程之间的数据交互
- Java线程总结(十):并发包------两个线程交换数据Exchanger
- 控制并发线程数的Semaphore和线程之间的数据交换Exchanger
- Exchanger用于线程间交换数据
- Java Exchanger(两线程交换数据)
- java 线程间交换数据的Exchanger
- java学习——使用Exchanger实现两个线程间的数据交换
- linux,windows 可执行文件(ELF、PE)
- Android自定义类似ProgressDialog效果的Dialog
- linux的二进制编辑
- cocos2d-x《农场模拟经营养成》游戏完整源码
- 合并merge into
- Exchanger两个线程之间交换数据
- oracle表空间使用率统计查询
- git 比较不同
- SVN的使用方法
- android实现activity半透明色
- Java基础——正则表达式
- BZOJ 题目1208: [HNOI2004]宠物收养所(SBT)
- Linux编译+更换3.4版本内核教程 [复制链接]
- matlab:Excel文件数据的导入及导出