2014-01-22 47 views
1

我的代碼如下:迭代的LinkedBlockingQueue,並在同一時間刪除內容

private LinkedBlockingQueue<TrackedOperation> operations = new LinkedBlockingQueue<TrackedOperation>(10000); 
     Iterator<TrackedOperation> it = operations.iterator(); 
     while (it.hasNext()) { 
      TrackedOperation op = operations.remove(); 
          ... 
     } 

我的問題是:

會迭代器總是指向隊列的頭部,並且是預期行爲?

如果我沒了感覺,那麼我的問題是,什麼是迭代器的行爲?我的操作隊列和迭代器在上面的代碼中是否一致?

+0

什麼的Javadoc說? – Kayaman

+0

您通常會'while(true)E e = queue.take();'帶有阻塞隊列。然後中斷線程或發送特殊項目來打破循環。 – assylias

+0

@assylias ...文檔對「take()」說,檢索並刪除此隊列的頭部,如果有必要,等待元素變爲可用。我不明白等待在這裏意味着什麼。如果隊列爲空,那麼while(queue.take())的行爲是什麼。 – GJain

回答

0

只能調用it.remove()你叫it.next後()。 it.next()返回的元素將被it.remove()操作移除。

+2

不一定在作爲該隊列點的多線程環境中。 – assylias

+0

你有沒有參考該索賠?我可以相信隊列結構會在迭代時發生變化,但我很難相信它.remove()有時會刪除除it.next()檢索到的「當前項目」之外的其他東西甚至讓迭代器做到這一點? – JVMATL

+0

啊,我明白了 - 哇,即使在迭代器接口規範中,在remove方法下,它說:「如果在迭代過程中以任何方式修改底層集合,而不是通過調用此方法,則迭代器的行爲是未指定的方法。「 – JVMATL

0

接受@assylias回答上述

則通常將一段時間(真)電子E = queue.take();與阻塞隊列。然後中斷線程或發送一個特殊的項目,打破循環

4

這裏我做什麼,

while (!linkedBlockingQueue.isEmpty()) { 
    linkedBlockingQueue.remove(); //do what you want to with it 
}