Exchanger 并发工具类
2016-02-01 00:00
369 查看
JDK1.5中有一个Exchanger类,可以用来完成线程间的数据交换。
类java.util.concurrent.Exchanger提供了一个同步点,在这个同步点,一对线程可以交换数据。每个线程通过exchange()方法的入口提供数据给他的伙伴线程,并接收他的伙伴线程提供的数据,并返回。当两个线程通过Exchanger交换了对象,这个交换对于两个线程来说都是安全的。
类java.util.concurrent.Exchanger提供了一个同步点,在这个同步点,一对线程可以交换数据。每个线程通过exchange()方法的入口提供数据给他的伙伴线程,并接收他的伙伴线程提供的数据,并返回。当两个线程通过Exchanger交换了对象,这个交换对于两个线程来说都是安全的。
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 = "zxx"; System.out.println("线程" + Thread.currentThread().getName() + "正在把数据" + data1 +"换出去"); Thread.sleep((long)(Math.random()*10000)); String data2 = (String)exchanger.exchange(data1);//如果另一个线程没有到达A,则一直等待,执导到达交换数据 System.out.println("线程" + Thread.currentThread().getName() + "换回的数据为" + data2); }catch(Exception e){ } } }); service.execute(new Runnable(){ public void run() { try { String data1 = "lhm"; System.out.println("线程" + Thread.currentThread().getName() + "正在把数据" + data1 +"换出去"); Thread.sleep((long)(Math.random()*10000)); String data2 = (String)exchanger.exchange(data1);//A System.out.println("线程" + Thread.currentThread().getName() + "换回的数据为" + data2); }catch(Exception e){ } } }); } }
相关文章推荐
- crontab表达式
- mysql 命令总结
- primary key与unique的区别
- Java线程池的分析和使用
- Storm常见模式——流聚合
- Spring MVC 3 深入总结
- 《深入浅出 Java Concurrency》目录
- Maven with Scala
- CyclicBarrier 辅助工具类
- Mybatis源码学习(一)-整体框架理解
- Spring MVC之@RequestBody, @ResponseBody 详解
- 通过show status 来优化MySQL数据库
- ConcurrentLinkedQueue Demo
- Mysql或者Hive数据行变成列
- MySQL数据库事务隔离级别(Transaction Isolation Level)
- 重写equals方法也要重写hashCode
- Java多核线程笔记-volatile的原理与技巧
- 在实践中异常处理
- Tomcat启动过程原理详解
- 常用排序--冒泡/快速排序