您的位置:首页 > 编程语言 > Java开发

真正理解java wait notify

2016-03-21 17:48 302 查看
从字面上理解,

notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的monitor的话,则只能唤醒其中一个线程,具体唤醒哪个线程则不得而知。

nofityAll()方法能够唤醒所有正在等待该对象的monitor的线程,这一点与notify()方法是不同的。虽然会唤醒所有的进程,但是同时也只会有一个运行,因为只有一个进程可以获得锁。

notify()的意思在于,如果此时有三个进程wait在一个锁上,notify只会唤醒一个,其他的二个会继续等待notify信号,即使这个锁是空闲的,也不能执行下去。notifyAll()就会唤醒全部的等待在这个锁上的进程,一旦这个锁空闲,就会立即执行。也就是这三个进程会按某种顺序执行完毕。

可以把下面例子中的notify和notifyAll的注释替换一遍。看看结果

package com.me.test;

/**
* Created by Administrator on 2016/3/21.
*/
public class WaitNotifyTest {
private static Object object = new Object();

public static void main(String[] args){
Thread1 thr0 = new Thread1();
Thread1 thr1 = new Thread1();
Thread2 thr2 = new Thread2();
thr0.setName("wait1");
thr1.setName("wait2");
thr2.setName("notify");

thr0.start();
thr1.start();
thr2.start();
}

static class Thread1 extends Thread{
@Override
public void run(){
synchronized (object){
try {
System.out.println(Thread.currentThread().getName()+"得到锁");
object.wait();
System.out.println(Thread.currentThread().getName()+"执行");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

static class Thread2 extends Thread{
@Override
public void run(){
try {
sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (object){
System.out.println(Thread.currentThread().getName()+"执行");
//object.notify();
object.notifyAll();
System.out.println(Thread.currentThread().getName()+"释放锁");
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多线程