今天学习了一下Exchanger. 可以让一对线程交换数据,模拟了一个场景,标记一下,方便以后查看。
package multithread.exchanger; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Exchanger; /** * 兑换奖品 * * @author lemzhang * */ public class TestExchanger { /** * @param args */ public static void main(String[] args) { final TestExchanger t = new TestExchanger(); final BlockingQueue<String> queue = new ArrayBlockingQueue<String>(5); final Exchanger<String> exchanger = new Exchanger<String>(); for (int i = 0; i < 5; i++) { queue.offer("5角现金."); } t.exchange(exchanger, queue); } public void exchange(Exchanger<String> exchanger, BlockingQueue<String> queue) { new Thread(new Agent(exchanger, queue), "代理商").start(); new Thread(new Customer(exchanger), "消费者").start(); } class Customer implements Runnable { private final Exchanger<String> exchanger; public Customer(Exchanger<String> exchanger) { this.exchanger = exchanger; } @Override public void run() { String s = "5角的瓶盖"; String printStr = "[%s]我收集到一个中5角的瓶盖, 代理商给我兑换了%s \n"; for (int i = 0; i < 10; i++) { try { String ex = exchanger.exchange(s); if (!ex.equals("5角现金.")) printStr = "[%s]我收集到一个中5角的瓶盖, 但是 %s \n"; System.out.printf(printStr, Thread.currentThread() .getName(), ex); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Agent implements Runnable { private final Exchanger<String> exchanger; private final BlockingQueue<String> q; public Agent(Exchanger<String> exchanger, BlockingQueue<String> q) { this.exchanger = exchanger; this.q = q; } @Override public void run() { String printStr = "[%s]用[%s]兑换消费者的瓶盖:[%s] \n"; for (int i = 0; i < 8; i++) { String award = q.poll(); if (award == null) { award = "奖品兑完了,请下次再来."; printStr = "[%s]奖品库存没了,没有给消费者兑换\n"; } try { System.out.printf(printStr, Thread.currentThread() .getName(), award, exchanger.exchange(award)); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
相关推荐
Exchanger是java 5引入的并发类,Exchanger顾名思义就是用来做交换的。这里主要是两个线程之间交换持有的对象。当Exchanger在一个线程中调用exchange方法之后,会等待另外的线程调用同样的exchange方法。 两个线程都...
主要介绍了Java Exchanger并发类使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Exchanger 这是一种两方栅栏,各方在栅栏位置上交换数据。 应用场景:当两方执行不对称的操作(读和取) 线程池 任务与执行策略之间的隐形耦合 线程饥饿死锁 运行时间较长的任务 ...
java.util.concurrent包中的Exchanger类可用于两个线程之间交换信息。可简单地将Exchanger对象理解为一个包含两个格子的容器,通过exchanger方法可以向两个格子中填充信息。当两个格子中的均被填充时,该对象会自动...
主要介绍了Java编程线程同步工具Exchanger的使用实例解析,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
java并发工具类(CountDownLatch+Semaphore+Exchanger);java并发工具类(CountDownLatch+Semaphore+Exchanger);java并发工具类(CountDownLatch+Semaphore+Exchanger);java并发工具类(CountDownLatch+...
14. 交换机 Exchanger 15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 ...
线程同步装置:semaphore countdownlatch cyclicbarrier exchanger; 17 java与xml 用dom处理xml文档; 用sax处理xml文档; 用xslt转换xml; 对象与xml的转换; 18 java mail 使用smtp协议发送简单邮件; 发送带附件的...
主要介绍了java并发工具类-Semaphore,Exchanger,java并发工具类有很多,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面小编带大家来一起学习一下吧
主要介绍了Java多线程编程之使用Exchanger数据交换实例,本文直接给出实例代码,需要的朋友可以参考下
交换机 Exchanger 15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 Lock ...
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
Java并发编程学习宝典(漫画版),Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习...
全部代码出自电子工业出版社夏先波的《Java JDK实例宝典》一书,本书以J2SE 5.0为开发环境,选取Java应用的典型实例,循序渐进地介绍了Java语言的各种开发方法和技巧,实例代码注释详细规范,思路清晰。 第1章 ...
java并发包讲解 可以找我要代码,qq 3341386488 ## 线程安全-并发容器JUC--原理以及分析 1.arrayList --copyonWriteArraylist 优缺点 2.HashSet,TreeSet -- CopyONWriteArraySet,ConcurrentSkipListSet 3....
一、java.util.concurrent体系的主要大板块包含内容 二、Executors 三、Semaphor信号量 四、Exchanger线程交互 五、CyclicBarrier关卡模式 六、CountDownLatch计数器
数组阻塞队列ArrayBlockingQueue,延迟队列DelayQueue, 链阻塞队列 LinkedBlockingQueue,具有优先级的阻塞队列 PriorityBlockingQueue, 同步队列 ...文章知识点与官方知识档案匹配,可进一步学习相关知识
14. 交换机 Exchanger 15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 ...
提供通过熵产最小化进行锅炉内受热面优化设计,利用遗传算法实现多目标优化
14. 交换机 Exchanger 15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 ...