wait() and notify()

03-09-27 daywalker

有一段程序:

public class WaitAndNotify extends Thread{

public synchronized void run(){

try{

wait();

}catch(InterruptedException e){

e.printStackTrace(System.err);

}

}

public static void main(String[] args){

WaitAndNotify wan=new WaitAndNotify();

wan.start();

synchronized(wan){ //1

wan.notify(); //1

} //1

}

}

按照我的想法程序应该按下面的顺序运行:

1 开始新的线程(wan.start())

2 线程在run()方法中被阻塞

3 因为是调用的wait()阻塞线程,所以wan对象上的锁应当被放弃,从而使//1的代码被执行,线程被唤醒,程序得以继续执行

可实际情况是:

wan.start()被调用,线程被阻塞,没有继续向下执行。不知道是什么原因?

小弟初学, 还请多多关照

banq
2003-09-27 16:34

你对wait() and notify() 机制有一定误解。

wait() 和notify一般需要在同一个synchronized 点。

wwlhp@jdon.com
2003-09-28 19:30

在wan.start()呼叫之后,会有两个线程同时运行:main线程和wan代表的线程。但问题是,接下来哪个线程会被调度执行呢?You never know!

如果是wan代表的线程先执行,结果就是你所希望的。

但如果是main线程首先执行,wan线程就会永远在wait方法中等待。