簡體   English   中英

無限阻塞隊列Java

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM