今天温习了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多线程5—死锁和wait notify notifyAll
主要为大家详细介绍了Java通过wait()和notifyAll()方法实现线程间通信的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
wait()、notify()和notifyAll() wait()和sleep() 线程中断 静态方法(有关同步的细节) 总结 第五章 Java线程编程的例子 数据结构和容器 简单的同步例子 一个网络服务器类 AsyncInputStream类 使用TCP...
在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待...
Java多线程机制 9.1 Java中的线程 9.2 Thread的子类创建线程 ...9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 9.9 计时器线程Timer 9.10 线程联合 9.11 守护线程
主要介绍了Java多线程中wait、notify、notifyAll使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
wait set——线程的休息室 wait方法——把线程放入wait set notify方法——从wait set拿出线程 notifyAll方法——从wait set拿出所有线程 wait、notify、notifyAll是Object类的方法 线程的状态移转 跟线程有关的其他...
本资源致力于向您介绍 Java 并发编程中的线程基础,涵盖了多线程编程的核心概念、线程...线程间通信: 详解线程间通信的方法,包括 wait、notify 和 notifyAll 方法的使用。讲解如何通过这些方法实现线程的协作和同步。
Java多线程同步(wait()notify()notifyAll())[文].pdf
一 基本知识 2 1.1 任务Runnable 2 1.2 线程构造器Threat 2 1.3 执行器Executor 2 ...2.5 线程合作(wait || notifyAll) 21 2.5.1 Wait()两种形式 21 2.5.2 互斥的实现 22 2.5.3 notify()与notifyAll() 24
绍java多线程之wait(),notify(),notifyAll()
本篇文章是对java多线程 wait(),notify(),notifyAll()进行了详细的分析介绍,需要的朋友参考下
创建多个condition对象 一个condition对象的signal(signalAll)方法和该对象的await方法是一一对应的,也就是一个condition对象的signal(signalAll)...Condition类的signalAll方法和Object类的notifyAll方法等效
主要介绍了Java多线程基础 线程的等待与唤醒,需要的朋友可以参考下
读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和notifyall方法,学习如何初始化、控制和协调并发操作。此外,本书还提供了有关并发编程的全方位的详细内容,例如限制和同步、...
Java多线程的等待唤醒机制代码演示 通过代码,完整的还原消费者和生产者的等待唤醒过程 生产者和消费者是一个十分经典的多线程协作模式 **常见方法:** - void wait() 当前线程等待,直到被其他线程唤醒 - void...
java多线程应用实例,包括wait、notify、notifyAll等的应用方法,经过调试,可以直接运行。
4.线程间通信:lock、condition、wait、notify、notifyAll 5.Lock-free:atomic、concurrentMap.putIfAbsent、CopyOnWriteArrayList 6.关于锁的经验介绍 7.并发流程控制手段:CountDownLatch、Barrier 8.定时器:...
最新JAVA技术内存模型 --创建、启动和加入线程 ─ 同步 ─ wait和notifyAll
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 62、同步和...