当您在未等待的对象上调用notifyAll方法时会发生什么?应该有例外还是正常情况?Java - wait and notifyAll
回答
这是完全正常的。您只能通知在一台显示器上等待的所有内容。其他人都不感兴趣。您调用notifyAll的对象只是其他人正在等待的显示器。如果没有人在等待没有人需要通知
正如您在这里看到的,在不等待的对象上调用notifyAll()没有任何影响。
只有等待对象得到通知。 Object.wait()阻塞,直到超时或通知 - 所以问题仍然是如何或为什么你会认为非等待的对象会得到通知?这个不成立。
对象不会等待或被通知 - 线程可以。在监视器对象上调用notifyAll()而不知道是否有线程在等待它是完全可能的和正常的。例如,在具有队列的生产者/消费者场景中,当生产者向队列中添加新元素并通知所有正在等待(即无)消费者时,消费者可能已经清空了队列并仍然被处理占用。 – 2009-05-06 08:45:01
我消除了线程以尽可能简化事情。 – 2009-05-06 10:54:03
对象“等待”,不等待自己。线程正在等待。如果没有人在等待,没有人会醒来,没有什么特别的事情会发生。
当闹铃响起但没人听到时会发生什么? – 2012-01-20 15:43:34
完全正常的情况。
假设你有一个生产者线程的队列将元素放入其中,并且一个消费者线程从中删除元素。
现在消费者可能已经清空了队列,仍然处于占用状态,因此没有人正在等待队列变为非空。现在生产者在队列中添加一个新元素。如果它正在等待,他必须调用notifyAll()来唤醒消费者。添加额外的逻辑来检查是否有人正在等待,只有在这种情况下调用notifyAll()才会增加场景的复杂度(并且非常容易出错) - 每次只调用notifyAll()会更容易。
我可能只会分裂毛发;-)认为在notifyAll上从'等待'状态变为'运行'状态的线程可能不是严格正确的;至少不是没有告诫告知线程所做的第一件事就是重新监视监视器锁定。而且由于通知线程数量中只有一个可以获取它,其他人将被阻止。 BLOCKED(Thread.State.Blocked)是线程状态。但阻塞是不等于,因为阻塞的线程不需要另一个notify()信号来恢复。 [那么我知道虚假的唤醒,但是对于一些JVM实现来说也许是相反的 - 错过了通知?]
public class HellBoy {
public static class MyThread extends Thread {
static final public Object sharedLock = new Object();
public void run() {
synchronized (sharedLock) {
System.out.println("Gonna wait...");
try {
sharedLock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Woken up but sleeping with the lock");
try {
Thread.sleep(2500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("exiting and unlocking");
}
}
}
public static void main(String[] args) throws Exception {
new MyThread().start();
new MyThread().start();
new MyThread().start();
new MyThread().start();
Thread.sleep(200);
synchronized (MyThread.sharedLock) {
MyThread.sharedLock.notifyAll();
}
}
}
- 1. Java - wait()和notifyAll()
- 2. Java的通知(),notifyAll的()和wait()方法
- 3. Java:Multithreading -Wait/notifyAll问题
- 4. 如何使用wait/notifyAll
- 5. 同步语句中的wait(),notify()和notifyAll()
- 6. Java程序在使用wait和notifyAll时会冻结
- 7. Android Java处理程序,线程同步块(notifyall&Wait)
- 8. 什么是synchronized()/ wait()/ notifyAll()在Java中做什么?
- 9. 转换wait&notifyAll代码以使用Java 1.5 Lock对象
- 10. Java线程通知()与notifyAll()
- 11. 的Java notifyAll的:抛出:IllegalMonitorStateException
- 12. Java wait()&notify()vs Android wait()&notify()
- 13. Java方法NotifyAll()不起作用?
- 14. winapi模拟java的synchronized/wait()
- 15. 如何使用wait()和notifyAll()逐个运行线程?
- 16. 使用wait()和notifyAll()设置和获取方法
- 17. wait()和notifyAll的()在我的代码不会在for循环
- 18. 如何实现wait();等待notifyAll();从输入按钮?
- 19. 为什么wait()在notifyAll()被调用后无法工作
- 20. 为什么布尔标志不能用作wait()/ notifyAll()互斥锁?
- 21. 为什么wait,notify和notifyAll方法在Object Class中?
- 22. 在java中等待,通知和notifyall?
- 23. jQuery PDF Download - Please Wait and Success消息
- 24. 线程notall后notifyall()
- 25. 线程notifyAll()
- 26. 关于等待和notifyAll的
- 27. GWT和notifyAll()(java.lang.Object)
- 28. 例如,如何调用notifyAll会影响Java中的执行?
- 29. Java - 何时使用notify或notifyAll?
- 30. Java wait()方法的行为
它可能不是完全正确把一个线程等待对notifyAll的运行,或者至少在没有需要提醒的是一个通知线程做的第一件事就是regrab监视器锁定。而且由于通知的线程数量中只有一个可以获取,所以其他人将被阻止。但阻塞与等待不同,因为阻塞的线程不需要另一个notify()信号。 – 2012-01-20 15:52:52