为什么MainClass不会从等待状态

时间:2016-06-24 16:52:49

标签: java wait notify

在下面的代码中,为什么wait()之后的部分不会执行。 即使在主线程拥有锁的对象中存在notify()。

public class MainClass {

    public static void main(String[] args) {
        Demo dm = new Demo();
        dm.add();

        synchronized (dm) {
            try {
                System.out.println("going to wait");
                dm.wait();
                System.out.println("after wait");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(dm.result);              
        }
    }
}

class Demo  {
    int result;

    public void add(){
        System.out.println("in demo");
        synchronized (this) {
            System.out.println("in demo syn block");
            for(int i=0;i<=10;i++) {
                result=i+result;                
            }
            System.out.println("IN demo:"+result);
            notify();       
            }
        }
    }
}

我需要知道的是 - 为什么即使notify()在那里,wait()之后的代码也没有执行。如果我尝试使用线程解决这个问题,那么wait()会自动退出它的状态。

1 个答案:

答案 0 :(得分:0)

您打电话的顺序是错误的。

  1. 首先,您从Demo主题调用main类的Demo方法。
  2. 此方法将锁定dm对象并完成任务并完成。
  3. 然后你在主线程中锁定wait对象并开始等待它。
  4. 那么发生什么事这是你在等待,没有人在通知。所以你的代码永远不会在ElementFinder语句

    之后执行