2011-05-10 72 views
0
 
    1 LinkedBlockingQueue queJobs = new LinkedBlockingQueue(150); 
    2 .......... 
    3 .. Some other code.... 
    4 .......... 
    5 Job curJob = queJobs.take(); 
    6 .................... 
    7 .. Again some other code... 
    8 .................... 
    9 if(condition1){ 
    10 queJobs.put(curJob); 
    11 } 

我的問題是當condition1爲true時,我將對象放回隊列中。但最初它在隊列的頂部,但放置後,它將在隊列的末尾。
我的要求是:
1.我可以把後面的元件上的隊列

2.不知何故,我可以等待在管線5的頂部,而不會從隊列中移除元件。Java - LinkedBlockingQueue問題

回答

3

隊列被定義爲在一端讀取並寫入另一端。所以不,不能把它放回去。 但是你可以使用LinkedBlockingDeque來代替,在這方面這是更通用的。

如果這不是一個選項,您可以使用peek()獲取但不能刪除curJob,並且以後只能刪除它if (!condition1)

UPDATE

,但我用的取(),因爲它會阻止執行,直到隊列爲空。

peek()肯定不適合你。但是我懷疑你的整體邏輯有一個缺點。通常情況下,您不必將作業重新放入隊列中。也許更好的解決方案是使用只有工作線程已知的另一個集合,其中放置已開始但尚未完成的作業,並在作業隊列之前從該集合讀取。

+0

thanx,我認爲LinkedBlockingDeque會幫助我。偷看()肯定不是我的使用。 – Aniruddha 2011-05-10 12:17:38

+0

thanx LinkedBlockingDeque解決了我的問題 – Aniruddha 2011-05-10 12:30:28

1

您可以使用peek()來檢索頭部,但不會將其刪除。然後檢查condition1是否爲false。如果是,則用take()將其刪除。

可以將元素添加回頭部,但很麻煩。您可以撥打指定者()toList(),它支持在指數增加0.1

參考:http://download.oracle.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingQueue.html

+1

但我使用take(),因爲它會阻塞執行,直到隊列爲空。有第二個線程將元素添加到隊列中,我需要停止執行處理該隊列元素的線程。 – Aniruddha 2011-05-10 12:15:18

1

更天作之合可能是使用的PriorityBlockingQueue,將允許你指定優先級的元素。這不完全是你要求的,但只是一個建議。

+0

感謝您的建議 – Aniruddha 2011-05-10 12:18:17