`
cjm0000000
  • 浏览: 32780 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java Exchanger 学习笔记

阅读更多

今天学习了一下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并发Exchanger的使用

    Exchanger是java 5引入的并发类,Exchanger顾名思义就是用来做交换的。这里主要是两个线程之间交换持有的对象。当Exchanger在一个线程中调用exchange方法之后,会等待另外的线程调用同样的exchange方法。 两个线程都...

    Java Exchanger并发类使用方法

    Java Exchanger并发类使用方法 Java Exchanger是Java 5引入的并发类,用来实现两个线程之间的对象交换。Exchanger顾名思义,就是用来做交换的。这里主要是两个线程之间交换持有的对象。当Exchanger在一个线程中调用...

    Java-Guide (Java核心知识笔记)

    这是一份详尽的Java学习资源,旨在帮助Java开发者巩固和深化其核心知识。这份笔记包含了从基础到高级的各类Java编程概念,是学习和进阶Java技术的宝贵资料。Markdown格式使得内容易于阅读和编辑,适合在各种Markdown...

    Java:Exchanger类的作用.docx

    Java中的`Exchanger`类是`java.util.concurrent`包的一部分,设计用于在多线程环境中进行数据交换。这个类提供了一个同步点,使得两个线程能够有效地传递它们各自的数据。`Exchanger`的核心功能在于它维护了两个槽位...

    Java编程线程同步工具Exchanger的使用实例解析

    Java编程线程同步工具Exchanger的使用实例解析 Java编程线程同步工具Exchanger是Java编程语言中的一种线程同步工具,它提供了一种方便的方式来交换线程之间的信息。Exchanger类可以作为两个线程交换对象的同步点,...

    Java并发编程(学习笔记).xmind

    Exchanger 这是一种两方栅栏,各方在栅栏位置上交换数据。 应用场景:当两方执行不对称的操作(读和取) 线程池 任务与执行策略之间的隐形耦合 线程饥饿死锁 运行时间较长的任务 ...

    Java多线程编程之使用Exchanger数据交换实例

    Java多线程编程中的Exchanger是一个非常有用的工具类,它位于`java.util.concurrent`包下,主要用于线程间的数据交换。Exchanger的核心功能是让两个线程在一个同步点相遇,进行数据交换。当一个线程调用`exchange`...

    Java架构面试专题(含答案)和学习笔记

    本专题旨在帮助Java开发者在面试过程中能够自信地回答各类问题,同时也是自我提升和学习的良好资料。 1. **Java基础** - 类与对象:理解面向对象的基本概念,如封装、继承、多态。 - 数据类型与变量:掌握基本...

    java并发工具类(CountDownLatch+Semaphore+Exchanger)

    Java并发工具类是Java并发编程中的重要组成部分,其中包括了多种实用的工具,如CountDownLatch、Semaphore和Exchanger,这些工具类极大地简化了多线程环境下的同步和协调问题。 1. **CountDownLatch**: ...

    29 一手交钱,一手交货—Exchanger详解.pdf

    在Java并发编程中,Exchanger是一个非常有用的工具类,它允许两个线程间进行数据交换。这个类在处理需要同步的交互式任务时特别有用,比如在多阶段处理或者需要线程间协作的情况。Exchanger的工作原理就像一个中介,...

    java加强笔记

    ### Java加强笔记知识点详解 #### 一、JDK1.5的新特性 ##### 1. 自动装箱与拆箱 - **自动装箱**:指的是将基本数据类型自动转换成对应的包装类对象。 - 例如:`int i = 1; Integer j = i;` - **自动拆箱**:则是...

    张孝祥Java多线程与并发库高级应用笔记

    ### 张孝祥Java多线程与并发库高级应用笔记概览 #### 一、Java多线程技术的重要性与挑战 Java线程技术是软件工程领域不可或缺的一部分,尤其在底层编程、Android应用开发以及游戏开发中,其重要性不言而喻。然而,...

    java并发工具包 java.util.concurrent中文版用户指南pdf

    14. 交换机 Exchanger 15. 信号量 Semaphore 16. 执行器服务 ExecutorService 17. 线程池执行者 ThreadPoolExecutor 18. 定时执行者服务 ScheduledExecutorService 19. 使用 ForkJoinPool 进行分叉和合并 20. 锁 ...

    java高并发程序设计(原版电子书)

    这本书是Java开发者提升并发编程能力的宝贵资源,适合有一定Java基础并希望在并发编程领域深入学习的读者。通过阅读并实践书中的内容,读者可以更好地应对高并发场景下的各种挑战,提高系统的效率和稳定性。

    通俗易懂学习java并发工具类-Semaphore,Exchanger

    总结,Semaphore和Exchanger都是Java并发编程中重要的工具类。Semaphore用于控制并发访问的资源数量,避免资源过度消耗;Exchanger则用于线程间的数据交换,实现高效的协作处理。掌握这两个工具类的使用,能帮助...

    java jdk实列宝典 光盘源代码

    线程同步装置: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并发编程全景图.pdf

    学习并发编程不仅是对技术的挑战,也是对程序员逻辑思维和问题解决能力的考验。随着硬件性能的持续提升和应用需求的多样化,Java并发编程的实践和理论研究将不断深化,为开发高性能、高可用性的系统提供支持。

    Java API 1.8英文版

    Java API 1.8英文版是Java开发的关键...对于初学者和有经验的开发者来说,深入学习Java API 1.8英文版都是一项重要的任务。通过阅读文档,实践编程,你将能够更好地掌握Java 1.8的精髓,并利用这些新特性解决实际问题。

    Java1.8API中文文档

    这份文档是开发者学习、查阅和理解Java 1.8核心库的关键工具。 在Java 1.8中,有许多关键的更新和增强,其中包括: 1. **Lambda表达式**:这是Java 8最显著的特性之一,引入了函数式编程的概念。Lambda表达式允许...

Global site tag (gtag.js) - Google Analytics