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

wait和notify使用

阅读更多

好文章转载!

1.wait和notify
这两个方法都是Object中的方法,放在一块是因为他们关系非常密切.
wait就是等待这个对象的同步锁,不过调用这个方法必须先获得这个对象的同步锁,就这一点很多人就搞晕了.
这里先解释一下这两个方法,然后给出一个小例子说明.

wait:等待对象的同步锁,需要获得该对象的同步锁才可以调用这个方法,否则后收到一个IllegalMonitorStateException,这个是运行时异常.调用这个方法后,就放弃了这个同步锁了.如果不带参数的wait方法就只有等别人唤醒了,如果带一个参数的
化就设置等待最长时间,过了这个时间即使没有人唤醒这个线程也不再等待了.

notify:唤醒在等待该对象同步锁的线程(只唤醒一个,如果有多个在等待),但是notifyAll可以唤醒所有等待的线程,注意唤醒的时在notify之前wait的线程,之后的没有效果.

这里举一个通俗的例子,两个人共有一个卫生间(每次只能一个人用),他们都要刷牙和方便,他们是这样约定的,轮流用,第一个人先刷牙,然后第二个人刷牙...

 

class Syn
{
        public static void main(String[] args) throws Exception
        {
            TwoPeople.ONE.start();
            TwoPeople.TWO.start();
        }
}


class TwoPeople extends Thread
{
    private int i=0;
    static Thread ONE=new TwoPeople(1);
    static Thread TWO=new TwoPeople(2);

    static Object washroom=new Object();   
    private TwoPeople(int i){this.i=i;}
    public void run(){
        synchronized(washroom){
            try{
                if(i==1){
                    brush(); //1
                  washroom.wait(); //2
                    release(); //6  
                    washroom.notify(); //7
                }
            else{
                    brush(); //3
                    washroom.notify(); //4
                    washroom.wait(); //5
                    release(); //8
            }
            }catch(InterruptedException e){e.printStackTrace();}
        }
    }
    private void brush() {
            System.out.println("People "+i+" is brushing !");
             try{Thread.sleep(2000);}catch(InterruptedException e){e.printStackTrace();}
            //延迟两秒看效果
            System.out.println("People "+i+" has burshed !");
    }
    private void release(){
            System.out.println("People "+i+" is releasing !");
            try{Thread.sleep(2000);}catch(InterruptedException e){e.printStackTrace();}
            //延迟两秒看效果
            System.out.println("People "+i+" has released !");
    }
};

 

分享到:
评论
2 楼 kaowww153 2010-07-30  
确实很经典啊
1 楼 leejah 2010-07-19  

s h i t...
你的代码里有wait or notufy吗? 吊毛啊

相关推荐

    wait和notify讲解

    wait和notify讲解

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

    wait和notify的使用 在上面的代码中,我们可以看到,ThreadA类中的main方法调用了ThreadB类的实例,并启动了它。然后,main方法调用wait方法,进入等待状态,直到ThreadB类的实例调用notify方法来唤醒它。在ThreadB...

    Java 同步方式 wait和notify/notifyall

    下面是一个简单的生产者消费者模型示例,演示了`wait()`, `notify()` 的使用: ```java public class Buffer { private int data; private boolean available = false; public synchronized void put(int item)...

    wait()、notify()和notifyAll()方法1---马克-to-win java视频

    wait()、notify()和notifyAll()方法1---马克-to-win java视频

    Java多线程wait和notify

    本文将详细探讨如何使用 `wait()` 和 `notify()` 来控制子线程的开始、暂停/继续以及结束。 首先,理解 `wait()` 和 `notify()` 的工作原理至关重要。`wait()` 方法会让当前持有锁的线程进入等待状态,释放锁,直到...

    wait_notify_demo

    为了确保线程安全,我们需要使用`wait()`和`notify()`方法协调这两个操作。例如,当缓冲区满时,生产者应调用`wait()`等待,让消费者有机会消费;当缓冲区为空时,消费者应调用`wait()`等待,让生产者有机会生产。 ...

    java中几个notify、wait使用实例

    为了实现这一点,我们可以使用`wait()`和`notify()`来控制线程的执行顺序。具体实现如下: 1. 在每个线程中,使用`synchronized`关键字锁定同一个对象。 2. 当一个线程完成其打印任务后,调用`notify()`方法唤醒另...

    深入理解Wait、Notify和Wait与sleep区别

    - **权限和锁**:`wait()`, `notify()`和`notifyAll()`需要在同步上下文中使用,而`sleep()`则不需要。 - **资源释放**:`wait()`会释放对象锁,而`sleep()`不会。 - **唤醒机制**:`wait()`需要其他线程调用`notify...

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

    wait, notify 和 notifyAll,这些在多线程中被经常用到的保留关键字,在实际开发的时候很多时候却并没有被大家重视。本文对这些关键字的使用进行了描述。  在 Java 中可以用 wait、notify 和 notifyAll 来实现...

    Java的sychronized、wait和notify范例

    在提供的压缩包文件`java_sychronization`中,可能包含了一些示例代码,用于演示如何在Java中使用`synchronized`关键字以及`wait()`和`notify()`方法。通过研究这些样例,你可以更深入地了解这些工具的用法和效果。...

    JAVAWAIT和NOTIFY的用法.pdf

    JAVAWAIT和NOTIFY的用法.pdf

    主线程去控制子线程wait与notify

    在本文中,我们将深入探讨如何使用主线程来控制子线程的`wait()`和`notify()`操作,以及它们在并发编程中的作用。 首先,`wait()`方法会导致当前线程进入等待状态,直到其他线程调用同一个对象的`notify()`或`...

    一个理解wait()与notify()的例子

    ### 一个理解wait()与notify()的例子 #### 知识点概述 本文旨在解析一个具体的Java多线程示例代码,以帮助读者更好地理解`wait()`与`notify()`方法的作用及其实现机制。这两个方法是Java中实现线程间通信的重要...

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

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

    wait,notify等线程知识.pdf

    通过使用wait()、notify()和notifyAll(),或者Lock和Condition,开发者可以控制线程的执行顺序,确保共享资源的安全访问。 7. **死锁和活锁问题**: 使用wait/notify机制时,需要注意死锁和活锁问题。死锁发生在两...

    java-wait和notify的用法.pdf

    在Java编程语言中,`wait()`和`notify()`是Object类中的两个关键方法,它们用于线程间的协作和通信。这两个方法在多线程环境下尤其重要,因为它们允许线程等待特定条件并通知其他线程继续执行。在分析给定的程序之前...

    浅谈java多线程wait,notify

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

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

    下面我们将详细介绍这三个方法的使用和作用。 一、wait()方法 wait()方法是使当前线程自动释放占有的对象锁,并等待notify。该方法的调用必须在synchronized代码块或者方法中,因为wait()方法需要当前线程必须获得...

    Java 同步锁 wait notify 学习心得

    `wait`和`notify`通常与条件变量模式结合使用,以实现线程之间的协调。例如,在生产者-消费者模型中,生产者线程在向共享缓冲区添加元素时可能会调用`wait()`,直到有空闲空间可用。消费者线程在移除元素后会调用`...

Global site tag (gtag.js) - Google Analytics