`
bo_hai
  • 浏览: 561805 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JAVA多线程 Exchanger 应用

 
阅读更多
import java.util.concurrent.Exchanger;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * 案例:服务员向原有空杯中不断倒水,消费者不断从原有装满水的杯中喝水。  
 * 当服务员倒满水和消费者喝完水时,两个杯子进行交换。一直这样周而复始。 
 * @author liuhongbo
 *
 */
public class ExchargerTest {
	
	static Exchanger<Cup> exchanger = new Exchanger<Cup>();
	// 初始化时,100 只杯子都是满的
	static Cup fullCup = new Cup(100);
	static Cup emptyCup = new Cup(0);
	
	public static void main(String[] args) {
		ExecutorService exec = Executors.newCachedThreadPool();
		exec.execute(new Waiter(3));
		exec.execute(new Customer(6));
		exec.shutdown();
	}

	static class Waiter implements Runnable {

		int addSpeed = 1;
		public Waiter(int addSpeed) {
			this.addSpeed = addSpeed;
		}
		
		@Override
		public void run() {
			while (emptyCup != null) {
				try {
					// 如果都是空杯,
					if (emptyCup.isFull()) {
						// 当waiter把空杯装满水后,与Customer交换杯子
						// exchange(emptyCup) 中参数的emptyCup是waiter装满水后的,把装满水后的emptyCup参数传递给cutomer线程。
						// 并且返回cutomer线程中fullCup给waiter的emptyCup,这样达到交换本子的目的
						emptyCup = exchanger.exchange(emptyCup);
					} else {
						// 有空杯,但不都是空杯,住空杯中加水
						emptyCup.addWaterToCup(addSpeed);
						System.out.println("Waiter add " + addSpeed + "  and current capacity is " + emptyCup.capacity);  
						TimeUnit.SECONDS.sleep(1L);
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	static class Customer implements Runnable {
		int drinkSpeed = 1;

		public Customer(int drinkSpeed) {
			this.drinkSpeed = drinkSpeed;
		}
		
		@Override
		public void run() {
			while (fullCup != null) {
				try{
					// 如果满杯是空的,则进行交换
					if (fullCup.isEmpty()) {
						fullCup = exchanger.exchange(fullCup);
						System.out.println("Customer: " + fullCup.capacity);
					} else {
						// 如果满杯不全是空的,客户drink
						fullCup.drinkFormCup(drinkSpeed);
						System.out.println("Customer drink "+ drinkSpeed + " and current capacity is " + fullCup.capacity);
						TimeUnit.SECONDS.sleep(2L);
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	static class Cup {
		private int capacity = 0;
		public Cup(int capacity) {
			this.capacity = capacity;
		}
		
		public void addWaterToCup(int i) {
			capacity += i;
			capacity = capacity > 100 ? 100 : capacity;
		}
		public void drinkFormCup(int i) {
			capacity -= i;
			capacity = capacity < 0 ? 0 : capacity;
		}
		public boolean isFull() {
			return capacity == 100 ? true : false;
		}
		public boolean isEmpty() {
			return capacity == 0 ? true : false;
		}
	}
}

 参考:http://conkeyn.iteye.com/blog/547370

分享到:
评论

相关推荐

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

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

    经典Java多线程与并发库高级应用

    在深入探讨Java多线程与并发库的高级应用前,有必要了解一些基础概念。Java线程是Java程序的基础,它代表程序中的一条执行线索或线路。在Java中创建线程有两种传统方式,一种是通过继承Thread类并覆盖其run方法来...

    深入了解java多线程

    Java多线程是现代软件开发中不可或缺的一部分,它为开发者提供了强大的工具来构建高效、响应迅速的应用程序。然而,正确地理解和使用多线程也需要深入学习和实践,特别是在线程同步和通信方面,以避免常见的错误,如...

    java多线程设计模式(pdf)

    总之,《Java多线程设计模式》是一本全面而深入的并发编程指南,涵盖了从基础理论到高级应用的广泛内容。通过学习,开发者不仅能掌握Java多线程的核心概念,还能习得解决实际并发问题的方法和策略,提升自己的并发...

    深入解析Java多线程

    Java多线程是Java编程中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程技术是不可或缺的一部分,尤其是在服务器端应用、高并发处理和实时系统中。本文将...

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

    3. Exchanger的应用场景:Exchanger可以应用于各种需要线程之间交换数据的场景,例如,在多线程编程中,Exchanger可以用来实现线程之间的数据交换,从而提高程序的效率和可靠性。 Exchanger的优点: 1. 方便易用:...

    面向Java多线程机制的软件重构方法.pdf

    Java多线程机制是Java编程中的核心特性,它允许程序同时执行多个独立的任务,从而提高应用程序的效率和响应性。本文将深入探讨Java多线程的原理、设计模式以及重构方法,旨在帮助开发者更好地理解和优化多线程环境下...

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

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

    多线程笔记_java/多线程_

    在Java编程语言中,多线程是程序设计中的一个重要概念,尤其在开发高效能和响应迅速的应用时。本文档将全面解析多线程的基础知识,从简单到复杂,帮助开发者深入理解并掌握这一核心技术。 一、多线程基础 1.1 线程...

    java多线程

    Java多线程是Java编程中一个非常重要的概念,它允许程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。在网络编程中,多线程技术的应用尤为广泛,可以处理并发请求、异步数据传输等复杂场景。在这个...

    Android多线程全新讲解.pdf

    2. Java多线程高级特性:内容中出现的“ThreadLocal”,“CyclicBarrier”,“CountDownLatch”,“Exchanger”,“ArrayBlockingQueue”,“Lock”,“Condition”和“Semaphore”,这些都是Java 5以后版本引入的...

    JAVA集合、多线程

    Java集合与多线程是Java编程中的两个核心概念,它们在实际开发中有着广泛的应用。本文将深入探讨这两个主题,并结合实例进行详细讲解。 首先,我们来看Java集合。集合是Java提供的一种数据结构,用于存储多个对象。...

    java线程与并发编程实践

    Java提供了一系列并发工具类,如Semaphore(信号量)、CyclicBarrier(循环屏障)、CountDownLatch(计数器门锁)和Exchanger(交换器),它们用于控制线程间访问资源的顺序和数量,协调多个线程间的操作。...

    thread.zip--狂神多线程+juc

    《狂神多线程+juc》是一份针对Java并发编程深度学习的资源包,主要涵盖了Java多线程基础以及Java并发工具集(JUC)的高级应用。在Java编程中,多线程是提高程序效率、实现并发执行的重要手段,而JUC(Java ...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段05讲、采用多线程方式模拟银行排队叫号.mp4 │ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable...

    JAVA中多线程技术的实现.pdf

    以上知识点只是Java多线程技术中的一部分。实际上,实现多线程程序的编写和调试是相对复杂的,需要对线程生命周期、线程同步、线程通信等多个方面的知识有深刻的理解。由于Java语言的并发模型以线程为基础,因此掌握...

    Java开发实战从入门到精通视频教程下载第9章 多线程.zip

    通过本章的学习,你将掌握Java多线程编程的基础知识,了解如何创建和管理线程,解决并发问题,以及使用Java提供的并发工具类。这些技能将对你的Java开发工作带来极大的帮助,使你能编写出更加高效、稳定的多线程应用...

    马士兵多线程训练营笔记

    在IT领域,多线程是并发编程中的一个关键概念,特别是在Java这样的多线程支持语言中。马士兵是一位知名的IT教育专家,他的多线程训练营笔记深入浅出地讲解了这一主题,帮助开发者理解并掌握多线程的精髓。 多线程...

    某电信项目多线程同步数据实例

    综上所述,这个电信项目实例展示了Java多线程技术在实际项目中的应用,包括线程创建、同步、管理和优化,以及并发工具的使用,这些都是Java程序员必须掌握的关键技能。通过深入理解这些概念和技术,开发者可以构建出...

    Java线程.zip

    总的来说,Java线程是实现并发编程的基础,理解和掌握线程的创建、同步、通信和管理技巧,对于编写高效、健壮的多线程Java应用至关重要。通过阅读"Java线程.pdf"文档,你可以深入学习这些知识,并在实践中不断提升你...

Global site tag (gtag.js) - Google Analytics