2012-02-05 79 views
13

當從文件內容填充隊列時,深度似乎不會增加,因爲在此實現中未添加元素。隊列滿,深度阻塞隊列,需要澄清

BlockingQueue<String> q = new SynchronousQueue<String>(); 
      ... 
     fstream = new FileInputStream("/path/to/file.txt"); 
      ... 
     while ((line = br.readLine()) != null) { 
      if (q.offer(line)) 
       System.out.println("Depth: " + q.size()); //0 
     } 

add更換offer,異常,如果拋出

Exception in thread "main" java.lang.IllegalStateException: Queue full 
    ... 

什麼我做錯了嗎?爲什麼插入第一個元素後,隊列立即滿了?

回答

17

檢查SynchronousQueue的文檔:

一種阻塞隊列,其中每個put必須等待一個take,反之亦然。同步隊列沒有任何內部容量,甚至沒有一個容量爲。你不能偷看一個同步隊列,因爲一個元素只有在你嘗試獲取時纔會出現; 除非另一個線程試圖將其刪除,否則無法添加元素(使用任何方法);你不能迭代,因爲沒有什麼可以迭代。隊列頭是第一個排隊的線程試圖添加到隊列中的元素;如果沒有排隊的線程,則不添加任何元素,並且頭部爲空。對於其他Collection方法(例如contains),SynchronousQueue充當空集合。該隊列不允許空元素。

您需要讓消費者設置並等待,然後才能嘗試添加到隊列中。

將指定元素插入此隊列中,如果另一個線程等待接收:如果沒有消費者

offer方法不會做任何事情。

+3

RTFM ftw。謝謝你。將在10分鐘內接受 – JAM 2012-02-05 18:43:56

+16

實際上,由於沒有空氣呼吸,您甚至無法在有同步隊列的情況下呼吸。同步隊列是一切,什麼都不是,它無處不在。單純地球居民無法理解同步隊列的形而上學意義。 – Tudor 2012-02-05 18:48:01

2

從的Javadoc:

。一個阻塞隊列,其中每個put必須等待一個take,反之亦然。同步隊列沒有任何內部容量,甚至沒有一個容量