`
kingj
  • 浏览: 426450 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java线程wait和notifyAll方法的简单使用

 
阅读更多

        今天温习了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>>终于拿到干净的杯子了,开始泡一杯清茶

 

 

分享到:
评论
2 楼 kingj 2012-08-09  
用condition的await和signal方法比用wait和nofity好的原因在哪儿呢,求高见
1 楼 ndsafhhlk 2012-07-27  
既然都用了java5的线程并发库了,为什么不用Condition里的await 和 singal 方法呢?这个比wait 和 notify 好吧。

相关推荐

    wait和notifyAll方法的使用示例

    在Java多线程编程中,`wait()` 和 `notifyAll()` 方法是非常重要的同步机制,主要用于实现线程间的通信与同步控制。通过合理运用这些方法,可以有效地解决生产者消费者模型中的资源竞争问题。本文将结合具体的代码...

    Java 同步方式 wait和notify/notifyall

    在Java中,`wait()`, `notify()`, 和 `notifyAll()` 是Java Object类的三个方法,它们在实现线程间通信和协作时扮演着关键角色。这些方法主要用于解决线程等待和唤醒的问题,是基于Java Monitor(监视器)模型的。 ...

    Java wait和notifyAll实现简单的阻塞队列

    在 Java 中,wait 和 notifyAll 是两个非常重要的方法,它们都是在 Object 类中声明的,用于实现线程之间的通信和同步。wait 方法会使调用线程进入等待状态,并释放所持有的对象锁,而 notifyAll 方法则会去唤醒当前...

    源码—Java多线程5—死锁和wait notify notifyAll

    源码—Java多线程5—死锁和wait notify notifyAll

    Java通过wait()和notifyAll()方法实现线程间通信

    Java提供了一套基于对象监视器机制的线程通信方式,其中包括`wait()`、`notify()`和`notifyAll()`方法。这些方法都是在`java.lang.Object`类中定义的,因此所有Java对象都具备这些功能。本篇将详细介绍如何使用`wait...

    Java线程中的notifyAll唤醒操作(推荐)

    在Java线程中,notifyAll()方法经常被用来唤醒所有等待对象的线程,以便它们可以继续执行。例如,在一个生产者-消费者模型中,消费者线程可能等待生产者线程生产完毕,然后唤醒消费者线程继续执行。在这种情况下,...

    Java多线程中wait、notify、notifyAll使用详解

    Java多线程中wait、notify、notifyAll使用详解 Java中多线程编程中,wait、notify、notifyAll三个方法是非常重要的,它们都是Object对象的方法,用于线程之间的通信。下面我们将详细介绍这三个方法的使用和作用。 ...

    Java多线程wait和notify

    在Java中,`wait()` 和 `notify()` 方法是实现线程间通信和协作的重要工具,它们属于 `java.lang.Object` 类,这意味着所有类都默认继承了这两个方法。本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程...

    java之wait,notify的用法([ 详解+实例 ])

    在Java多线程编程中,wait和notify是两个非常重要的方法,它们都是Object类的方法,用于线程之间的通信和同步。下面我们将详细解释wait和notify的用法。 wait方法 wait方法是Object类的一个方法,用于让当前线程...

    如何在Java中正确使用 wait, notify 和 notifyAll

     在 Java 中可以用 wait、notify 和 notifyAll 来实现线程间的通信。。举个例子,如果你的Java程序中有两个线程——即生产者和消费者,那么生产者可以通知消费者,让消费者开始消耗数据,因为队列缓冲区中有内容待...

    Java线程状态流转图

    Java线程状态流转图是一种用于描述Java线程生命周期中不同的状态和状态转换的图形表示方式。该图形展示了Java线程从创建到终止的整个生命周期,并详细介绍了每种状态的特点和转换规则。 NEW(初始化状态) 在Java...

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    以上就是对Java线程中wait、await、sleep、yield、join用法的总结。这些方法在实际开发中,对于控制多线程运行的时序和协调非常关键。理解这些方法的正确使用方式是掌握Java并发编程的基础。同时,使用时需特别注意...

    java 多线程设计模式 进程详解

    wait()、notify()和notifyAll() wait()和sleep() 线程中断 静态方法(有关同步的细节) 总结 第五章 Java线程编程的例子 数据结构和容器 简单的同步例子 一个网络服务器类 AsyncInputStream类 使用TCP...

    Java线程学习和总结

    本文将深入探讨Java线程的核心概念、API以及在实际开发中的应用,旨在帮助你理解和掌握这一关键技能。 首先,我们需要了解什么是线程。在单核CPU系统中,线程是操作系统调度的基本单位,而在多核CPU系统中,每个...

    Java线程使用教程

    2. **线程通信**:`wait()`, `notify()` 和 `notifyAll()` 方法用于线程间的通信,它们必须在`synchronized`代码块或方法中使用。 3. **线程优先级**:Java线程有10个优先级,通过`setPriority()`设置,但实际调度...

    浅谈java多线程wait,notify

    在本文中,我们将通过示例代码详细介绍Java多线程wait和notify的使用,帮助读者更好地理解和掌握这两个机制。 wait机制 在Java中,wait机制用于暂停当前线程的执行,并释放当前对象的锁,以便让其他线程获得锁并...

    java线程.pdf

    常用的通信方法有`wait()`、`notify()`和`notifyAll()`等。 1. **wait()**:使当前线程暂停执行,并释放当前持有的锁。 2. **notify()**:唤醒正在等待该对象锁的一个线程。 3. **notifyAll()**:唤醒所有正在等待...

    Java的wait(), notify()和notifyAll()使用心得

    Java中的`wait()`, `notify()`, 和 `notifyAll()` 是多线程编程中的关键工具,它们用于在并发环境中协调线程间的交互。这些方法都定义在`java.lang.Object`类中,因为它们与对象的监视器(monitor)概念密切相关。...

    Java线程.ppt

    同步是为了确保线程按预定的顺序执行,防止数据竞争,可以使用`wait()`, `notify()`和`notifyAll()`方法配合`synchronized`实现。 学习Java线程,理解其创建、状态转换、调度和控制,以及如何处理线程间的互斥和...

    Java多线程同步(wait()notify()notifyAll())[文].pdf

    - Java提供了java.util.concurrent和java.util.concurrent.atomic包,其中包含了一些线程安全的类和方法,它们不依赖于synchronized实现线程安全。 5. **示例分析**: - 提供的Account类示例展示了如何使用...

Global site tag (gtag.js) - Google Analytics