【发布时间】:2016-09-11 19:07:45
【问题描述】:
我知道在没有获得对象所有权的情况下调用wait() 方法会导致异常。
和来自 Java 文档,关于调用 wait()
线程
* 释放此监视器的所有权并等待另一个线程
* 通知在这个对象的监视器上等待唤醒的线程
* 通过调用{@code notify} 方法或
* {@code notifyAll} 方法。
所以一旦在对象上调用wait(),该特定线程就会失去对该对象的所有权,直到其他线程通知它。
为什么在没有通知的情况下调用wait() 两次,而不是抛出错误?
为了确保,..我只是运行了生产者,所以我没有其他线程来通知它,wait() 方法被无限次调用。
然而,尽管在第一次 wait() 调用后失去了所有权,但随后的等待调用应该抛出异常。不是吗?但为什么它工作正常?
class Producer extends Thread {
private Queue<Integer> queue;
private int maxSize;
public Producer(Queue<Integer> queue, int maxSize, String name) {
super(name);
this.queue = queue;
this.maxSize = maxSize;
}
public void run() {
while (true) {
synchronized (queue) {
try {
queue.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
【问题讨论】:
-
“不止一次”是什么意思?您是否从不同的线程调用上面的
run()方法? (也许它是从您没有向我们展示的某些代码中调用的?)
标签: java multithreading wait