是否有一個帶有阻塞隊列的實現,但有一個最大大小限制。當隊列大小達到給定的最大大小時,不會阻塞'put',它會刪除head元素並插入它。所以把不被阻塞(),但採取()是。阻塞'take()'的隊列實現,但帶有驅逐策略
一個用法是,如果我有一個非常緩慢的消費者,系統不會崩潰(內存不足),而這些消息將被刪除,但我不想阻止生產者。
股票交易系統的一個例子。當您在股票交易/報價數據上漲時,如果您沒有消費數據,您希望自動拋棄舊的股票交易/報價。
是否有一個帶有阻塞隊列的實現,但有一個最大大小限制。當隊列大小達到給定的最大大小時,不會阻塞'put',它會刪除head元素並插入它。所以把不被阻塞(),但採取()是。阻塞'take()'的隊列實現,但帶有驅逐策略
一個用法是,如果我有一個非常緩慢的消費者,系統不會崩潰(內存不足),而這些消息將被刪除,但我不想阻止生產者。
股票交易系統的一個例子。當您在股票交易/報價數據上漲時,如果您沒有消費數據,您希望自動拋棄舊的股票交易/報價。
目前在Java中沒有一個線程安全的隊列,它將執行你正在尋找的任務。但是,有一個BlockingDequeue(雙端隊列),您可以編寫一個包裝器,您可以從頭部和尾部隨意取出。
這個類,類似於BlockingQueue,是線程安全的。
ThreadPoolExecutor提供了幾種策略。在javadoc中搜索「AbortPolicy」。如果需要,您也可以實施自己的策略。也許Discard
是類似於你想要的。我個人認爲CallerRuns
是你想在大多數情況下。
我認爲使用這些是一個更好的解決方案,但是如果你絕對想在隊列中實現它,我可能會通過組合來實現。也許使用LinkedList
或其他東西,並用synchronize
關鍵字包裝它。
編輯:(一些澄清..) 「執行者」基本上是一個線程池與阻塞隊列相結合。這是在java中實現生產者/消費者模式的推薦方式。這些圖書館的作者提供了幾種策略來處理像你提到的問題。如果您有興趣,here是專門解決OOME問題的另一種方法(源代碼是特定於框架的,不能按原樣使用)。
AbortPolicy在ThreadPool正在關閉時使用,因此它需要排空排隊的任務。我想要的是一個最大大小的隊列,當您添加新任務時會彈出第一條消息。 另外,你附加的netty樣本被'封鎖'了。我所尋找的實現並未被阻止,而是排在隊列頭上。 – mjlee 2010-05-07 05:06:59
@mjlee:那麼,建議的搜索只是爲了讓您更容易找到該部分。我不打算使用該政策。我想我會提供一個更通用的答案。如果你想要什麼你特別想要的,我建議實施一個自定義策略。您可以使用Deque作爲隊列實現,以便您可以從頭部彈出。就我個人而言,我覺得它雖然從頭上彈出很奇怪。爲什麼不簡單地丟棄?沒有根本的區別,而且更簡單,更簡單。它已經被其他人實施。 – 2010-05-07 05:12:15
btw,不,AbortPolicy不用於排除任務。當製片人速度太快時,放棄這個策略是一種策略! – 2010-05-07 06:11:59