今天温习了java线程的知识,看到wait和notify时,有感而发,不说废话,直接上代码。
package com.zx.thread.work;
import java.util.concurrent.*;
public class UsingWaitAndNotify {
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
Cup cup = new Cup("水晶杯");
// 开始时,杯子未洗干净,因此泡茶人被挂起
exec.execute(new TeaMaker(cup));
// 洗杯子的人发现杯子是不干净的,于是开始洗杯子,
// 洗完杯子后,通知泡茶的人,可以泡茶了
exec.execute(new Washer(cup));
exec.shutdown();
}
}
/**
* 我们列举一个洗杯子泡茶的流程 1、先洗干净杯子,然后才能泡茶 2、ok,茶泡好了,慢慢品尝一番,然后倒掉茶叶,准备重新泡一杯茶 3、重复第一步和第二步
*
* @author maping
*
*/
class Cup {
private volatile boolean washed = false;
private String name;
public Cup() {
}
public Cup(String name) {
this.name = name;
}
public synchronized void wash(Runnable owner) throws InterruptedException {
System.out.println(owner.getClass().getSimpleName() + ">>正在洗杯子");
Thread.sleep(3000);
washed = true;
// 杯子洗干净了,可以泡茶了
notifyAll();
System.out.println(owner.getClass().getSimpleName()
+ ">>杯子洗干净了,你可以拿去泡茶用了");
}
public synchronized void makeTea(Runnable owner)
throws InterruptedException {
System.out.println(owner.getClass().getSimpleName() + ">>准备泡茶");
// 如果杯子未被洗干净,那么我只有等待杯子被洗干净才能开始泡茶
while (!washed) {
System.out.println(owner.getClass().getSimpleName()
+ ">>很无奈,杯子是脏的,我只有等它被洗干净,我自己懒得动手洗");
wait();
}
System.out.println(owner.getClass().getSimpleName()
+ ">>终于拿到干净的杯子了,开始泡一杯清茶");
}
public String toString() {
return "Cup of " + this.name;
}
}
class Washer implements Runnable {
private Cup cup;
public Washer(Cup cup) {
this.cup = cup;
}
public void run() {
System.out.println(this.getClass().getSimpleName() + ">>我是清洁工,开始洗杯子");
try {
cup.wash(this);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class TeaMaker implements Runnable {
private Cup cup;
public TeaMaker(Cup cup) {
this.cup = cup;
}
public void run() {
System.out.println(this.getClass().getSimpleName() + ">>我是泡茶工,我开始泡茶");
try {
cup.makeTea(this);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
运行结果:
TeaMaker>>我是泡茶工,我开始泡茶
TeaMaker>>准备泡茶
TeaMaker>>很无奈,杯子是脏的,我只有等它被洗干净,我自己懒得动手洗
Washer>>我是清洁工,开始洗杯子
Washer>>正在洗杯子
Washer>>杯子洗干净了,你可以拿去泡茶用了
TeaMaker>>终于拿到干净的杯子了,开始泡一杯清茶
分享到:
相关推荐
在Java多线程编程中,`wait()` 和 `notifyAll()` 方法是非常重要的同步机制,主要用于实现线程间的通信与同步控制。通过合理运用这些方法,可以有效地解决生产者消费者模型中的资源竞争问题。本文将结合具体的代码...
在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...
在 Java 中,wait 和 notifyAll 是两个非常重要的方法,它们都是在 Object 类中声明的,用于实现线程之间的通信和同步。wait 方法会使调用线程进入等待状态,并释放所持有的对象锁,而 notifyAll 方法则会去唤醒当前...
源码—Java多线程5—死锁和wait notify notifyAll
Java提供了一套基于对象监视器机制的线程通信方式,其中包括`wait()`、`notify()`和`notifyAll()`方法。这些方法都是在`java.lang.Object`类中定义的,因此所有Java对象都具备这些功能。本篇将详细介绍如何使用`wait...
在Java线程中,notifyAll()方法经常被用来唤醒所有等待对象的线程,以便它们可以继续执行。例如,在一个生产者-消费者模型中,消费者线程可能等待生产者线程生产完毕,然后唤醒消费者线程继续执行。在这种情况下,...
Java多线程中wait、notify、notifyAll使用详解 Java中多线程编程中,wait、notify、notifyAll三个方法是非常重要的,它们都是Object对象的方法,用于线程之间的通信。下面我们将详细介绍这三个方法的使用和作用。 ...
在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...
在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object类的一个方法,用于让当前线程...
在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待...
Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换规则。 NEW(初始化状态) 在Java...
以上就是对Java线程中wait、await、sleep、yield、join用法的总结。这些方法在实际开发中,对于控制多线程运行的时序和协调非常关键。理解这些方法的正确使用方式是掌握Java并发编程的基础。同时,使用时需特别注意...
wait()、notify()和notifyAll() wait()和sleep() 线程中断 静态方法(有关同步的细节) 总结 第五章 Java线程编程的例子 数据结构和容器 简单的同步例子 一个网络服务器类 AsyncInputStream类 使用TCP...
本文将深入探讨Java线程的核心概念、API以及在实际开发中的应用,旨在帮助你理解和掌握这一关键技能。 首先,我们需要了解什么是线程。在单核CPU系统中,线程是操作系统调度的基本单位,而在多核CPU系统中,每个...
2. **线程通信**:`wait()`, `notify()` 和 `notifyAll()` 方法用于线程间的通信,它们必须在`synchronized`代码块或方法中使用。 3. **线程优先级**:Java线程有10个优先级,通过`setPriority()`设置,但实际调度...
在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地理解和掌握这两个机制。 wait机制 在Java中,wait机制用于暂停当前线程的执行,并释放当前对象的锁,以便让其他线程获得锁并...
常用的通信方法有`wait()`、`notify()`和`notifyAll()`等。 1. **wait()**:使当前线程暂停执行,并释放当前持有的锁。 2. **notify()**:唤醒正在等待该对象锁的一个线程。 3. **notifyAll()**:唤醒所有正在等待...
Java中的`wait()`, `notify()`, 和 `notifyAll()` 是多线程编程中的关键工具,它们用于在并发环境中协调线程间的交互。这些方法都定义在`java.lang.Object`类中,因为它们与对象的监视器(monitor)概念密切相关。...
同步是为了确保线程按预定的顺序执行,防止数据竞争,可以使用`wait()`, `notify()`和`notifyAll()`方法配合`synchronized`实现。 学习Java线程,理解其创建、状态转换、调度和控制,以及如何处理线程间的互斥和...
- Java提供了java.util.concurrent和java.util.concurrent.atomic包,其中包含了一些线程安全的类和方法,它们不依赖于synchronized实现线程安全。 5. **示例分析**: - 提供的Account类示例展示了如何使用...