[英]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.