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线程技术是软件工程领域不可或缺的一部分,尤其在底层编程、Android应用开发以及游戏开发中,其重要性不言而喻。然而,...
在深入探讨Java多线程与并发库的高级应用前,有必要了解一些基础概念。Java线程是Java程序的基础,它代表程序中的一条执行线索或线路。在Java中创建线程有两种传统方式,一种是通过继承Thread类并覆盖其run方法来...
Java多线程是现代软件开发中不可或缺的一部分,它为开发者提供了强大的工具来构建高效、响应迅速的应用程序。然而,正确地理解和使用多线程也需要深入学习和实践,特别是在线程同步和通信方面,以避免常见的错误,如...
总之,《Java多线程设计模式》是一本全面而深入的并发编程指南,涵盖了从基础理论到高级应用的广泛内容。通过学习,开发者不仅能掌握Java多线程的核心概念,还能习得解决实际并发问题的方法和策略,提升自己的并发...
Java多线程是Java编程中的一个核心概念,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程技术是不可或缺的一部分,尤其是在服务器端应用、高并发处理和实时系统中。本文将...
3. Exchanger的应用场景:Exchanger可以应用于各种需要线程之间交换数据的场景,例如,在多线程编程中,Exchanger可以用来实现线程之间的数据交换,从而提高程序的效率和可靠性。 Exchanger的优点: 1. 方便易用:...
Java多线程机制是Java编程中的核心特性,它允许程序同时执行多个独立的任务,从而提高应用程序的效率和响应性。本文将深入探讨Java多线程的原理、设计模式以及重构方法,旨在帮助开发者更好地理解和优化多线程环境下...
Java多线程编程中的Exchanger是一个非常有用的工具类,它位于`java.util.concurrent`包下,主要用于线程间的数据交换。Exchanger的核心功能是让两个线程在一个同步点相遇,进行数据交换。当一个线程调用`exchange`...
在Java编程语言中,多线程是程序设计中的一个重要概念,尤其在开发高效能和响应迅速的应用时。本文档将全面解析多线程的基础知识,从简单到复杂,帮助开发者深入理解并掌握这一核心技术。 一、多线程基础 1.1 线程...
Java多线程是Java编程中一个非常重要的概念,它允许程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。在网络编程中,多线程技术的应用尤为广泛,可以处理并发请求、异步数据传输等复杂场景。在这个...
2. Java多线程高级特性:内容中出现的“ThreadLocal”,“CyclicBarrier”,“CountDownLatch”,“Exchanger”,“ArrayBlockingQueue”,“Lock”,“Condition”和“Semaphore”,这些都是Java 5以后版本引入的...
Java集合与多线程是Java编程中的两个核心概念,它们在实际开发中有着广泛的应用。本文将深入探讨这两个主题,并结合实例进行详细讲解。 首先,我们来看Java集合。集合是Java提供的一种数据结构,用于存储多个对象。...
Java提供了一系列并发工具类,如Semaphore(信号量)、CyclicBarrier(循环屏障)、CountDownLatch(计数器门锁)和Exchanger(交换器),它们用于控制线程间访问资源的顺序和数量,协调多个线程间的操作。...
《狂神多线程+juc》是一份针对Java并发编程深度学习的资源包,主要涵盖了Java多线程基础以及Java并发工具集(JUC)的高级应用。在Java编程中,多线程是提高程序效率、实现并发执行的重要手段,而JUC(Java ...
以上知识点只是Java多线程技术中的一部分。实际上,实现多线程程序的编写和调试是相对复杂的,需要对线程生命周期、线程同步、线程通信等多个方面的知识有深刻的理解。由于Java语言的并发模型以线程为基础,因此掌握...
│ 高并发编程第一阶段05讲、采用多线程方式模拟银行排队叫号.mp4 │ 高并发编程第一阶段06讲、用Runnable接口将线程的逻辑执行单元从控制中抽取出来.mp4 │ 高并发编程第一阶段07讲、策略模式在Thread和Runnable...
通过本章的学习,你将掌握Java多线程编程的基础知识,了解如何创建和管理线程,解决并发问题,以及使用Java提供的并发工具类。这些技能将对你的Java开发工作带来极大的帮助,使你能编写出更加高效、稳定的多线程应用...
在IT领域,多线程是并发编程中的一个关键概念,特别是在Java这样的多线程支持语言中。马士兵是一位知名的IT教育专家,他的多线程训练营笔记深入浅出地讲解了这一主题,帮助开发者理解并掌握多线程的精髓。 多线程...
综上所述,这个电信项目实例展示了Java多线程技术在实际项目中的应用,包括线程创建、同步、管理和优化,以及并发工具的使用,这些都是Java程序员必须掌握的关键技能。通过深入理解这些概念和技术,开发者可以构建出...
总的来说,Java线程是实现并发编程的基础,理解和掌握线程的创建、同步、通信和管理技巧,对于编写高效、健壮的多线程Java应用至关重要。通过阅读"Java线程.pdf"文档,你可以深入学习这些知识,并在实践中不断提升你...