gpt4 book ai didi

java - Java 中 wait 和 notifyAll 的死锁 - 调用 notifyAll 时线程不会唤醒

转载 作者:行者123 更新时间:2023-11-30 11:03:18 26 4
gpt4 key购买 nike

我的程序应该使用线程(为了学习线程)按顺序打印出从 1 到 10 的数字。问题是程序陷入僵局。这是为什么?

我像这样创建 10 个线程:

for (int i = 0; i < 10; i++) {
new PrintThread(i).start();
}

线程类如下所示:

class PrintThread extends Thread {
int curr;
static Integer prev;

PrintThread(int curr) {
this.curr = curr;
}

public synchronized void run() {
if (prev == null) prev = curr - 1;

while (curr != prev + 1) {

System.out.println("Waiting...");

try { wait(); }
catch (InterruptedException e){ }

System.out.println("Woke up!");
}

System.out.println(i);
prev = curr;
notifyAll();
}
}

输出

0

Waiting... (9 times)

最佳答案

您的所有线程都同步并自行等待。因此,即使一个线程会通知,该通知也不会到达任何人,因为其他线程正在等待不同的监视器对象(即它们自己)。在这种情况下,所有线程都应该在一个公共(public)监视器对象上进行同步和等待/通知。

你根本不应该在 Thread 对象上使用 waitnotify 因为它实际上可能导致线程调度 iirc 中的死锁。

附带说明:不要扩展 Thread,而是实现 Runnable 并提供该 Runnable 的实例作为参数Thread 的构造函数。

关于java - Java 中 wait 和 notifyAll 的死锁 - 调用 notifyAll 时线程不会唤醒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30444398/

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