Java 为什么方法wait()在没有notify()的情况下工作? 非常感谢!

Java 为什么方法wait()在没有notify()的情况下工作? 非常感谢!,java,multithreading,reflection,wait,notify,Java,Multithreading,Reflection,Wait,Notify,我在同步两个线程时遇到问题:main和thread,这是从StepRunner.java调用的。我只需要在下一次迭代开始之前显示迭代的结果 我想要什么: Please enter step number [1, 2, 3 or 4] or 5 for exit: 2 Please enter natural value for factorial computing: 2 2! = 2 Please enter step number [1, 2, 3 or 4] or 5 for exit:

我在同步两个线程时遇到问题:main和thread,这是从StepRunner.java调用的。我只需要在下一次迭代开始之前显示迭代的结果

我想要什么:

Please enter step number [1, 2, 3 or 4] or 5 for exit: 2
Please enter natural value for factorial computing: 2
2! = 2
Please enter step number [1, 2, 3 or 4] or 5 for exit:
Please enter step number [1, 2, 3 or 4] or 5 for exit: 2
Please enter natural value for factorial computing: 2
Please enter step number [1, 2, 3 or 4] or 5 for exit: 2! = 2
我不想要的:

Please enter step number [1, 2, 3 or 4] or 5 for exit: 2
Please enter natural value for factorial computing: 2
2! = 2
Please enter step number [1, 2, 3 or 4] or 5 for exit:
Please enter step number [1, 2, 3 or 4] or 5 for exit: 2
Please enter natural value for factorial computing: 2
Please enter step number [1, 2, 3 or 4] or 5 for exit: 2! = 2
为此,我在StepRunner.java中同步了块:

public void run() {
        thread.start();
        synchronized (thread) {
            try {
                while (thread.isAlive()) { /**Loop is an Oracle's recommendation*/
                    thread.wait();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
但是为什么方法wait()在我的代码的任何位置都没有方法notify()的情况下可以正常工作呢?

指出,线程完成时,会在内部调用
Thread.notifyAll()

此实现使用This.wait调用的循环,该循环以This.isAlive为条件。当线程终止时,调用this.notifyAll方法。建议应用程序不要在线程实例上使用wait、notify或notifyAll

如您所见,不建议使用此功能,您的代码可以重写如下:

thread.start();
try {
    thread.join();    
} catch (InterruptedException e) {
    e.printStackTrace();
}
鉴于此语句仅出现在Java 7 javadoc中,建议不要使用此功能,因此此行为似乎曾经是
Thread
类的一个实现细节,但人们开始依赖它,因此语言作者必须对其进行记录。

声明
Thread.notifyAll()
在线程结束时在内部调用:

此实现使用This.wait调用的循环,该循环以This.isAlive为条件。当线程终止时,调用this.notifyAll方法。建议应用程序不要在线程实例上使用wait、notify或notifyAll

如您所见,不建议使用此功能,您的代码可以重写如下:

thread.start();
try {
    thread.join();    
} catch (InterruptedException e) {
    e.printStackTrace();
}

鉴于此语句仅出现在Java 7 javadoc中,建议不要使用此功能,因此此行为看起来像是
线程
类的一个实现细节,但人们开始依赖它,因此语言作者必须对其进行记录。

您检查过循环是否执行了吗?这只是一个猜测,但可能线程拥有自己的监视器(或者调度程序拥有),因此同步块仅在线程完成且不再活动后执行。当线程死亡时,它会通知自己。是否检查循环是否已执行?这只是一个猜测,但可能线程拥有自己的监视器(或者调度程序拥有),因此同步块仅在线程完成且不再活动后执行。当线程死亡时,它会通知自己。