gpt4 book ai didi

java : wait() method keeps waiting even after calling notifyAll()

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:48:17 26 4
gpt4 key购买 nike

考虑以下代码

public class ThreadTest1
{
private static final long startTime = System.currentTimeMillis();

public static void main(String args[])
{
Thread ct = new Thread(new ChildThread());
ThreadTest1.print("starting child threads in MAIN");
ct.start();
synchronized(ct)
{
try
{

ThreadTest1.print("about to start wait() in MAIN");
ct.wait();
ThreadTest1.print("after wait() in MAIN");
}
catch(Exception e)
{
ThreadTest1.print("Exception in MAIN");
}
}
}

public static void print(String s)
{
System.out.println("Millisecond : "+(System.currentTimeMillis()-ThreadTest1.startTime)+"\t: "+s);
}
}

class ChildThread implements Runnable
{
public void run()
{
synchronized(this)
{

try
{
ThreadTest1.print("before thread notifyAll in CHILD");
notifyAll();
ThreadTest1.print("notifyAll over, sleep starts in CHILD");
Thread.sleep(10000);
ThreadTest1.print("after thread sleep in CHILD");

}
catch(Exception e)
{
ThreadTest1.print("Exception in CHILD");
}
ThreadTest1.print("End of run method in CHILD");
}
}
}

输出如下:

Millisecond : 12        : starting child threads in MAIN
Millisecond : 13 : about to start wait() in MAIN
Millisecond : 13 : before thread notifyAll in CHILD
Millisecond : 13 : notifyAll over, sleep starts in CHILD
Millisecond : 10015 : after thread sleep in CHILD
Millisecond : 10015 : End of run method in CHILD
Millisecond : 10016 : after wait() in MAIN

notifyAll() 在第 13 毫秒被调用。但是控制仅在第 10016 毫秒时才从 wait() 中出来。

从上面给出的代码来看,似乎 wait() 调用没有在 notify() 调用后立即结束。

但是所有文件包括Java API , 指定调用 wait() 的方法应在 notify() 调用后立即获取锁。

如果调用 notify() 时 wait() 不会结束,那么对 notify() 的需求就变得无效了,因为调用 wait() 的方法会在新线程的 run 方法结束时自动获得控制权,即使未调用 notify()。

如果我在这里犯了错误,请等待有人指出。

最佳答案

问题是您正在通知和等待不同的 对象。您在 Threadwait() 并在 run() 方法中调用 this ...这是一个 ChildThread


由于您错误命名了您的 ChildThread 类,这一点被掩盖了。该名称​​暗示它是一个Thread 子类,但它实际上是一个Runnable 子类。

关于java : wait() method keeps waiting even after calling notifyAll(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20334637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com