2013-08-27 88 views
1

我無法理解Synchronous Queue的工作原理。
我的理解是,任務的切換是直接對線程進行的,但構造函數沒有像其他API那樣的最大線程數限制。
所以當一個putoffer完成它基本上傳遞給另一個線程或不是?
所以,如果我做,例如100 put它將被傳遞給100個線程?
我試圖讀取源代碼,但無法弄清楚會發生什麼。它似乎創建了一個鏈接的節點列表,其中每個節點封裝一個線程,但是如何維護這個列表,例如展開/縮小等,以及踏板如何運行這些任務對我而言並不清楚。
那麼這個列表是否擴展,因爲我們提供任務?結果消費者線程(服務員)不斷增加?
這些是否被重用?或者只是執行一些並停止?同步隊列是否在每個offer/put上創建線程?

回答

4

這聽起來像你誤解SynchronousQueue的目的。

SynchronousQueue不會創建任何線程。 當您撥打put時,put不會完成,直到另一個線程(您創建的線程)從SynchronousQueue中取出該元素。

「如果我做如100 put」如果你有一百個線程,每個線程調用同一SynchronousQueueput,那麼所有這些線程將等待,直到其他線程開始take這些元素了。如果您有一個線程,則一次只能執行一個put,並且每次都會等待另一個線程在添加另一個線程之前採用該元素。

內部使用的列表是一個鏈接列表,它擴展並像鏈接列表一樣得到GC'd。

+0

如果我的其中一個線程接收到另一個線程放入的數據,那麼鏈表需要什麼? – Jim

+0

需要的是你可能有100個線程,每個線程都有一個等待被佔用的元素。 –

+0

所以,如果我有'X'線程需要採取這個隊列的工作,我怎麼能根據負載調整'X'號碼?即相應地增加/減少它們? – Jim

2

據我所知,這個想法是,任務切換是直接線程 但構造不具備的 線程像其他的API綁定e.g最大數量。

隊列實現的構造函數中所有int參數的第一個參數是SIZE,而不是線程數。

那麼當我們提供任務時這個列表是否擴展?因此,消費者線程(服務員)不斷增加?

同步隊列用於切換目的。來自生產者的put()調用將阻塞,直到有一位消費者從隊列中執行take()。這與線程的數量無關。消費者線程不一定要增加。一旦消費者完成了一條消息的處理,它可以再次從隊列中取一個()。

public class MyWorker extends Thread { 
    private final BlockingQueue<String> queue; 
    public MyWorker(BlockingQueue<String> queue) { 
     this.queue = queue; 
    } 

    public void run() { 
     try { 
      while (true) { 
       String s = queue.take(); 
       doWork(s); 
      } 
     } 
     catch (InterruptedException ie) { 
      // just terminate 
     } 
    } 
} 

public class SyncQueueExample { 
    // …  
    public SyncQueueExample() { 
     try { 
      int workItem = 0; 
      // Create a synchronous queue 
      BlockingQueue<String> queue = new SynchronousQueue<String>(); 

      // Create the child worker thread 
      MyWorker worker = new MyWorker(queue); 
      worker.start(); 

      // Start sending to the queue 
      while (true) { 
       System.out.println("\nPlacing work on queue"); 
       String work = "Work Item:" + (++workItem); 
       queue.put(work); 
      } 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

輸出:運行時,隊列生產者和消費者之間的輸出將是 「協調」,在效果,和備用這樣:

Placing work on queue 
Thread 'Thread-1' processing work: Work Item:1 

Placing work on queue 
Thread 'Thread-1' processing work: Work Item:2 

Placing work on queue 
Thread 'Thread-1' processing work: Work Item:3 

Placing work on queue 
Thread 'Thread-1' processing work: Work Item:4 

更多關於Synchronous Queue