[英]Unbounded Blocking Queue Java
要求:实现无限制的阻塞队列,即,如果队列中不存在任何元素,则调用get的线程应阻塞。
public class BlockingQueue<T> {
private Queue<T> queue = new LinkedList<>();
private Object monitor = new Object();
/**
* add element to queue
*/
public void add(T element) {
synchronized (monitor) {
queue.add(element);
monitor.notify();
}
}
/**
* Returns element if present in queue
* otherwise calling thread blocks until an element is added to queue
*
* @return element from queue
*/
public T get() throws InterruptedException {
synchronized (monitor) {
while (queue.isEmpty()) {
monitor.wait();
}
return queue.poll();
}
}
}
问题
1.实施正确吗?
2.调用wait(); 将线程从RUNNABLE移到WAIT状态
调用notify(); 将线程从等待状态转移到阻塞状态
哪个动作将线程从“已阻止”状态转换为“可运行”状态?
暗示正确吗?
是
只需提一句:您可能希望使monitor
字段final
。
哪个动作将线程从BLOCKED变为RUNNABLE状态?
释放BLOCKED线程正在等待的锁的线程的动作。
当然,可能是另一个线程获取了监视器上的锁,然后该线程将保持阻塞状态,直到有机会获取监视器本身上的锁为止。
为了清楚起见,在监视器上调用wait()
会使调用线程进入WAIT状态,但也会导致线程释放其在监视器上的所有锁。 当通知了这样的线程时,该线程将变为“阻塞”,因为它需要重新获取其之前拥有的所有监视器上的所有锁,然后才能继续。 这就是为什么它先从等待变为阻塞的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.