`
cjm0000000
  • 浏览: 33141 次
  • 性别: 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-Guide (Java核心知识笔记)

    这份笔记包含了从基础到高级的各类Java编程概念,是学习和进阶Java技术的宝贵资料。Markdown格式使得内容易于阅读和编辑,适合在各种Markdown查看器或文本编辑器中打开。 ### 一、Java基础 1. **语法基础**:了解...

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

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

    西川的学习总结笔记,涵盖了java、spring、java其他常用框架,以及大数据组件相关等.zip

    注意看更新历史注如果需要学习资料,可以加我微信纪实西川笔记Java系列java进阶java 泛型java实例化的软件开发方式nio基础ArrayList源码分析LinkedList源代码分析HashSet和TreeSet源码分析HashMap源码分析(JDK1.8)...

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

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

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

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

    多线程笔记_java/多线程_

    Java提供了一些高级同步工具,如Semaphore(信号量)、CyclicBarrier(循环屏障)、CountDownLatch(倒计时锁)和Exchanger(交换器),它们提供了更灵活的线程同步方式。 四、线程池 Java的ExecutorService和...

    马士兵多线程训练营笔记

    通过马士兵的多线程训练营笔记,开发者不仅可以学习到多线程的基本概念,还能掌握高级并发编程技巧,这对于开发高并发、高性能的应用至关重要。在阅读和学习这些笔记时,结合实际的编程练习将有助于更好地理解和巩固...

    学习dubbo config

    这表明本段内容涉及了Dubbo配置模块的学习笔记,强调了在学习过程中记录和理解配置模块的必要性。 标签“dubbo config 学习”表明了主题是关于学习Dubbo的配置模块,强调了学习性质和配置模块的关联。 在提供的...

Global site tag (gtag.js) - Google Analytics