今天学习了一下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(); } } } } }
相关推荐
这份笔记包含了从基础到高级的各类Java编程概念,是学习和进阶Java技术的宝贵资料。Markdown格式使得内容易于阅读和编辑,适合在各种Markdown查看器或文本编辑器中打开。 ### 一、Java基础 1. **语法基础**:了解...
Exchanger 这是一种两方栅栏,各方在栅栏位置上交换数据。 应用场景:当两方执行不对称的操作(读和取) 线程池 任务与执行策略之间的隐形耦合 线程饥饿死锁 运行时间较长的任务 ...
注意看更新历史注如果需要学习资料,可以加我微信纪实西川笔记Java系列java进阶java 泛型java实例化的软件开发方式nio基础ArrayList源码分析LinkedList源代码分析HashSet和TreeSet源码分析HashMap源码分析(JDK1.8)...
本专题旨在帮助Java开发者在面试过程中能够自信地回答各类问题,同时也是自我提升和学习的良好资料。 1. **Java基础** - 类与对象:理解面向对象的基本概念,如封装、继承、多态。 - 数据类型与变量:掌握基本...
### 张孝祥Java多线程与并发库高级应用笔记概览 #### 一、Java多线程技术的重要性与挑战 Java线程技术是软件工程领域不可或缺的一部分,尤其在底层编程、Android应用开发以及游戏开发中,其重要性不言而喻。然而,...
Java提供了一些高级同步工具,如Semaphore(信号量)、CyclicBarrier(循环屏障)、CountDownLatch(倒计时锁)和Exchanger(交换器),它们提供了更灵活的线程同步方式。 四、线程池 Java的ExecutorService和...
通过马士兵的多线程训练营笔记,开发者不仅可以学习到多线程的基本概念,还能掌握高级并发编程技巧,这对于开发高并发、高性能的应用至关重要。在阅读和学习这些笔记时,结合实际的编程练习将有助于更好地理解和巩固...
这表明本段内容涉及了Dubbo配置模块的学习笔记,强调了在学习过程中记录和理解配置模块的必要性。 标签“dubbo config 学习”表明了主题是关于学习Dubbo的配置模块,强调了学习性质和配置模块的关联。 在提供的...