gpt4 book ai didi

java - Java 线程 wait() 和 Notify() 似乎工作异常

转载 作者:行者123 更新时间:2023-11-29 03:43:22 25 4
gpt4 key购买 nike

class myThreadRun implements Runnable
{

public void run() {
roo();
}
public synchronized void roo()
{
System.out.println("In thread before wait " + Thread.currentThread().getName());
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JOptionPane.showMessageDialog(null, "After wait in\n"+Thread.currentThread().getName());
System.out.println("In thread after wait " + Thread.currentThread().getName());
//notify();
}

public synchronized void foo()
{
notify();
}
}

public class ThreadingDemo {

public synchronized void Start()
{
System.out.println("Labamba");
myThreadRun mThRun = new myThreadRun();
Thread thread = new Thread(mThRun);
thread.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//mThRun.foo(); //This works
//mThRun.notify(); //crash
//thread.notify();//crash
try {
thread.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
public static void main(String[] args) {
new ThreadingDemo().Start();
}

这是演示 wait() 和 notify() 的简单代码,在 myThreadRun 类中,run() 方法只执行 wait() 而 foo() 方法执行 notify()如上面的代码所示,如​​果我执行 mThRun.notify() 程序崩溃,但 mThRun.foo() 运行顺利并给出急需的结果。我需要知道为什么?

最佳答案

您需要拥有该对象对所有obj.wait()obj.notify() 的监视器。

这就是为什么它在 mThRun 上的 synchronized block 内调用但在外部不起作用的原因。因此,如果您将 mThRun.notify(); 放在同步块(synchronized block)中,它会像这样工作:

synchronized (mThRun) {
mThRun.notify();
}

关于java - Java 线程 wait() 和 Notify() 似乎工作异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12155278/

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