Java 在多线程处理中,线程在没有notify()的情况下从等待状态出来

Java 在多线程处理中,线程在没有notify()的情况下从等待状态出来,java,multithreading,wait,Java,Multithreading,Wait,下面的代码如何在ThreadB未执行notify()时执行,ThreadA应保持等待状态。 当另一个线程完成其执行时,一个线程是否可能从等待状态出来 public class ThreadA extends Thread { public static void main(String[] args) { ThreadB B = new ThreadB(); B.start(); synchronized (B) {

下面的代码如何在ThreadB未执行notify()时执行,ThreadA应保持等待状态。 当另一个线程完成其执行时,一个线程是否可能从等待状态出来

public class ThreadA extends Thread
{
    public static void main(String[] args)
    {
        ThreadB B = new ThreadB();
        B.start();
        synchronized (B) {
            try {
                /* Go into waiting state */
                B.wait();
            } catch (InterruptedException e) {
            }

            System.out.println(B.result);
        }
    }
}

class ThreadB extends Thread
{
    int result;

    public void run()
    {
        synchronized (this) {
            for (int i = 0; i <= 10; i++) {
                result = result + i;
            }
            // notify();
        }
    }
}
公共类ThreadA扩展线程
{
公共静态void main(字符串[]args)
{
ThreadB=新的ThreadB();
B.开始();
已同步(B){
试一试{
/*进入等待状态*/
B.等待();
}捕捉(中断异常e){
}
系统输出打印项次(B.结果);
}
}
}
类ThreadB扩展线程
{
int结果;
公开募捐
{
已同步(此){

对于(int i=0;i如果您转到JavaDocs()并阅读线程的文档,您将看到它说永远不要在线程上使用wait、notify或notifyAll。在内部,Thread.join()和Thread death使用wait和notifyAll来完成连接功能

如果您转到JavaDocs()阅读Thread的文档,您会发现它说永远不要在线程上使用wait、notify或notifyAll线程死亡使用wait和notifyAll来完成连接功能

当线程结束/存在时,它将
notifyAll
在其实例上。这就是您看到的。

当线程结束/存在时,它将
notifyAll
在其实例上。这就是您看到的。

您认为
B.wait()
是吗?你为什么这么认为?一个线程通过执行目标对象的wait()方法进入这个等待列表。从那一刻起,它不会执行任何进一步的指令,直到调用目标对象的notify()方法。那么在你的示例中哪个线程会被阻塞?实际调用
B.wait()的主线程
或由
B
引用的
thread
对象表示的线程?我想它将是main()也就是说,ThreadASo不会阻止
B
表示的线程执行。请注意,在
thread
实例上不应该同步、
notify
wait
。您认为
B.wait()
有什么作用?您为什么这样认为?线程通过执行wait()进入此等待列表方法。从那一刻起,它不会执行任何进一步的指令,直到调用目标对象的notify()方法。那么,在您的示例中,哪个线程将被阻止?实际调用
B.wait()的主线程
或由
B
引用的
thread
对象表示的线程?我认为它将是main(),即ThreadASo,不会阻止
B
表示的线程执行。请注意,在
thread
实例上,永远不要同步、
notify
wait
。 55