今天学习了一下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并发类使用方法 Java Exchanger是Java 5引入的并发类,用来实现两个线程之间的对象交换。Exchanger顾名思义,就是用来做交换的。这里主要是两个线程之间交换持有的对象。当Exchanger在一个线程中调用...
这是一份详尽的Java学习资源,旨在帮助Java开发者巩固和深化其核心知识。这份笔记包含了从基础到高级的各类Java编程概念,是学习和进阶Java技术的宝贵资料。Markdown格式使得内容易于阅读和编辑,适合在各种Markdown...
Java中的`Exchanger`类是`java.util.concurrent`包的一部分,设计用于在多线程环境中进行数据交换。这个类提供了一个同步点,使得两个线程能够有效地传递它们各自的数据。`Exchanger`的核心功能在于它维护了两个槽位...
Java编程线程同步工具Exchanger的使用实例解析 Java编程线程同步工具Exchanger是Java编程语言中的一种线程同步工具,它提供了一种方便的方式来交换线程之间的信息。Exchanger类可以作为两个线程交换对象的同步点,...
Exchanger 这是一种两方栅栏,各方在栅栏位置上交换数据。 应用场景:当两方执行不对称的操作(读和取) 线程池 任务与执行策略之间的隐形耦合 线程饥饿死锁 运行时间较长的任务 ...
Java多线程编程中的Exchanger是一个非常有用的工具类,它位于`java.util.concurrent`包下,主要用于线程间的数据交换。Exchanger的核心功能是让两个线程在一个同步点相遇,进行数据交换。当一个线程调用`exchange`...
本专题旨在帮助Java开发者在面试过程中能够自信地回答各类问题,同时也是自我提升和学习的良好资料。 1. **Java基础** - 类与对象:理解面向对象的基本概念,如封装、继承、多态。 - 数据类型与变量:掌握基本...
Java并发工具类是Java并发编程中的重要组成部分,其中包括了多种实用的工具,如CountDownLatch、Semaphore和Exchanger,这些工具类极大地简化了多线程环境下的同步和协调问题。 1. **CountDownLatch**: ...
在Java并发编程中,Exchanger是一个非常有用的工具类,它允许两个线程间进行数据交换。这个类在处理需要同步的交互式任务时特别有用,比如在多阶段处理或者需要线程间协作的情况。Exchanger的工作原理就像一个中介,...
### Java加强笔记知识点详解 #### 一、JDK1.5的新特性 ##### 1. 自动装箱与拆箱 - **自动装箱**:指的是将基本数据类型自动转换成对应的包装类对象。 - 例如:`int i = 1; Integer j = i;` - **自动拆箱**:则是...
### 张孝祥Java多线程与并发库高级应用笔记概览 #### 一、Java多线程技术的重要性与挑战 Java线程技术是软件工程领域不可或缺的一部分,尤其在底层编程、Android应用开发以及游戏开发中,其重要性不言而喻。然而,...
14. 交换机 Exchanger 15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 ...
这本书是Java开发者提升并发编程能力的宝贵资源,适合有一定Java基础并希望在并发编程领域深入学习的读者。通过阅读并实践书中的内容,读者可以更好地应对高并发场景下的各种挑战,提高系统的效率和稳定性。
总结,Semaphore和Exchanger都是Java并发编程中重要的工具类。Semaphore用于控制并发访问的资源数量,避免资源过度消耗;Exchanger则用于线程间的数据交换,实现高效的协作处理。掌握这两个工具类的使用,能帮助...
线程同步装置:semaphore countdownlatch cyclicbarrier exchanger; 17 java与xml 用dom处理xml文档; 用sax处理xml文档; 用xslt转换xml; 对象与xml的转换; 18 java mail 使用smtp协议发送简单邮件; 发送带附件的...
根据给定文件的信息“JAVA并发编程实践”以及其描述为“Java并发学习资料”,我们可以从中提炼出关于Java并发编程的一些核心知识点。Java并发编程是Java高级特性之一,它允许开发者编写能够同时执行多个任务的程序,...
学习并发编程不仅是对技术的挑战,也是对程序员逻辑思维和问题解决能力的考验。随着硬件性能的持续提升和应用需求的多样化,Java并发编程的实践和理论研究将不断深化,为开发高性能、高可用性的系统提供支持。
Java API 1.8英文版是Java开发的关键...对于初学者和有经验的开发者来说,深入学习Java API 1.8英文版都是一项重要的任务。通过阅读文档,实践编程,你将能够更好地掌握Java 1.8的精髓,并利用这些新特性解决实际问题。
这份文档是开发者学习、查阅和理解Java 1.8核心库的关键工具。 在Java 1.8中,有许多关键的更新和增强,其中包括: 1. **Lambda表达式**:这是Java 8最显著的特性之一,引入了函数式编程的概念。Lambda表达式允许...