【问题标题】:Why MainClass is not coming out from waiting state为什么 MainClass 没有从等待状态中出来
【发布时间】:2016-06-24 16:52:49
【问题描述】:

在下面的代码中,为什么 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() 会自动退出它的状态。

【问题讨论】:

  • waits 后面的 notify 不受影响。目前尚不清楚您要在这里做什么。您的程序是单线程的。
  • wait() 和 notify() 不用于线程实例。如果我尝试使用线程,那么 wait() 会自动进入等待状态
  • 您可以拥有一个多线程程序,但不使用 waitnotify 及其对应的 Thread 对象。
  • 你能做到吗??我很困惑....昨天我试过了
  • Re,“如果我尝试使用线程解决这个问题...”如果您尝试解决 what?你想让程序做什么?

标签: java wait notify


【解决方案1】:

你打电话的顺序不对。

  1. 首先你从main线程调用Demo类的dm.add();方法。
  2. 此方法将获取Demo 对象的锁并执行任务并完成。
  3. 然后您在主线程中获取dm 对象的锁并开始等待它。

所以这里发生的事情是你在等待,然后没有人通知。所以你的代码永远不会在wait 语句之后执行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多