gpt4 book ai didi

java - 关于 wait 和 notifyAll

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:47 24 4
gpt4 key购买 nike

我有这门课:

public class MyThread implements Runnable {

private static boolean canAccess = true;
private Thread t;

public FirstThread(String name) {
t = new Thread(this);
t.setName(name);
}

public void start() {
t.start();
}

private synchronized void accessed(String name) throws InterruptedException {
if (canAccess) {
canAccess = false;
System.out.println("Accessed " + name);
try {
Thread.sleep(5000);
} catch (Exception e) {
}
canAccess = true;
System.out.println("NOTIFY: " + name);
notifyAll();
}
System.out.println("WAIT: " + name);
wait();

}

@Override
public void run() {
while (true) {
try {
accessed(Thread.currentThread().getName());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

这是我的输出:

Accessed 1
WAIT: 3
WAIT: 5
WAIT: 7
WAIT: 9
WAIT: 0
WAIT: 2
WAIT: 4
WAIT: 6
WAIT: 8
NOTIFY: 1
WAIT: 1

我的应用卡住(死锁状态)。似乎 notifyAll 方法不起作用。我的错误在哪里?

我的主类。

public class Main {

public static void main(String[] args) {
MyThread [] threads = new MyThread[10];
for(int i=0;i<threads.length;i++) {
threads[i] = new MyThread(""+i);
threads[i].start();
}

}

}

最佳答案

wait 表示线程释放锁并进入 hibernate 状态,直到另一个线程通知它。 notifyAll 表示该线程通知所有等待当前同步块(synchronized block)中正在使用的锁的其他线程唤醒并尝试再次获取锁。您的代码示例没有任何情况下多个线程试图获取相同的锁,因此在此处使用 wait 和 notifyAll 没有任何意义。一旦调用 wait,就没有什么可以唤醒线程了。

等待和通知的一个典型用途:您可能有许多生产者将东西放入队列,而消费者线程从队列中取出东西。队列有一个消费者调用的 take 方法,如果队列为空,则它调用 wait 并且消费者阻塞。队列有一个 put 方法,当有东西进入队列时调用 notifyAll 以便唤醒任何等待的消费者线程。

a producer-consumer example of using wait and notifyAll在 Java 教程中。

关于java - 关于 wait 和 notifyAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11384031/

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