2011-12-16 65 views
0

我正在盤旋LinkedBlockingQueue數百萬個字符串。 當源代碼中沒有更多項目時,閱讀線程應該結束執行。LinkedBlockingQueue中的「轉義」元素

我想過在LinkedBlockingQueue中輸入一個虛擬值,如"SHUTDOWN"

讀者做到這一點:

while ((data = (String)MyLinkedBlockingQueue.take()).equals("SHUTDOWN") == false) { 
    //read and live 
} 

其高效執行等於每串?如果不是,我可以用什麼來代替?

回答

2

您正處在正確的軌道上。這是一個BlockingQueue完成處理的標準成語,它被稱爲「毒丸」。我通常使用一個特殊的私有靜態最終實例來實現它,所以你可以做對象平等,不會冒險與真實值重疊。例如:

private static final String SHUTDOWN = new String("SHUTDOWN"); // use new String() so you don't get an interned value 

public void readQueue() { 
    while ((data = (String)MyLinkedBlockingQueue.take()) != SHUTDOWN) { 
     //read and live 
    } 
} 

public void shutdownQueue() { 
    MyLinkedBlockingQueue.put(SHUTDOWN); 
} 
0

您也可以考慮使用poll(),並在返回null時結束循環。

+0

不是很好,因爲隊列可以處於空閒狀態一段時間,但源有更多的數據放。 – jullin 2011-12-16 19:15:07

+0

好的。那麼如果你關心equals()的效率,爲什麼不讓SHUTDOWN變成一個常量並且使用'=='進行比較呢? – 2011-12-16 19:17:23

0

這可以實施,以便您不必每次都檢查「毒丸」。考慮使用適用於LinkedBlockingQueueThreadPoolExecutor。如果要關閉處理,請在執行程序對象上調用shutdown()方法。從該方法的文檔:

啓動有序關閉,其中以前提交的任務是 執行,但不會接受新的任務。如果已關閉,則調用沒有 附加效果。

看到這個職位,如果你有興趣關停處理,同時立即任務仍然在隊列中等待:With a Java ExecutorService, how do I complete actively executing tasks but halt the processing of waiting tasks?