日期:2014-05-20  浏览次数:20689 次

java 线程的wait和notify问题
Java code
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的到来,何解?

------解决方案--------------------
你这个就是wait在notify之前调用呀。
当w.start()时,waiter类的run方法开始执行,由于需要sleep(1000)。
在waiter类sleep的过程中,notifyer类的run方法开始执行,下面是重点:
就是当notifyer执行到
synchronized (t) {
t.notify();
}
时,发现waiter类正在执行,还没有结束,于是就等待waiter类run方法执行结束后,才继续执行了t.notify();

这里主要是synchronized关键字起到了作用,这是锁机制,保护线程安全的。