package WaitAndNotify;public class Test {
public static void main(String []args) throws InterruptedException{
waiter w=new waiter();
notifyer n=new notifyer(w);
w.start();
n.start();
}
}
class waiter extends Thread{
public synchronized  void run(){
try {
sleep(1000);
System.out.println("Going wait");
wait();
System.out.println("wake up");
} catch (InterruptedException e) {
System.out.println("Interrupt");
}
}
}class notifyer extends Thread{
waiter t;
public notifyer(waiter t){
this.t=t;
}
public void run(){
System.out.println("Going  notify");
synchronized (t) {
t.notify();
}
System.out.println("Notify Over");
}
}java编程思想上说 wait应该在notify之前调用否则会产生信号丢失,但是这里运行的时候貌似是notify在等待wait的到来,何解?

解决方案 »

  1.   

    你这个就是wait在notify之前调用呀。
    当w.start()时,waiter类的run方法开始执行,由于需要sleep(1000)。
    在waiter类sleep的过程中,notifyer类的run方法开始执行,下面是重点:
    就是当notifyer执行到
    synchronized (t) {
                t.notify();
            }
    时,发现waiter类正在执行,还没有结束,于是就等待waiter类run方法执行结束后,才继续执行了t.notify();这里主要是synchronized关键字起到了作用,这是锁机制,保护线程安全的。