- 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关键字起到了作用,这是锁机制,保护线程安全的。