簡體   English   中英

[Java]:我的場景使用哪種隊列?

[英][Java]: Which kind of queue to use for my scenario?

我是java的新手,但我迫切需要創建一個隊列和線程。 我很困惑必須使用哪個隊列類。

這是場景:

我需要一個線程來處理來自應用程序層的用戶事件以及來自較低中間件層的回調事件。 為此,決定維護隊列。 每當發生用戶事件或回調事件時,事件都將發布到此隊列。 線程輪詢隊列中的事件並采取適當的操作。 相同的隊列可以由不同的類(即應用層和下層)寫入。 因此,哪個隊列更安全,以確保不同類別不會同時寫入相同的位置?

此外,Queue,BlockingQueue和ArrayBlockingQueue之間的基本單句差異是什么,以及在哪些情況下必須選擇每個?

問候,kiki

在你列出的三個中,唯一實際上是類的是ArrayBlockingQueue。 阻塞隊列與普通隊列的不同之處在於,如果對象嘗試刪除前端項,它將暫停執行,直到有可用的項要刪除。

“BlockingQueue”和“Queue”只是一個接口; 你無法實例化它們。 可以實例化的BlockingQueue的類型是ArrayBlockingQueue,LinkedBlockingQueue等。

就個人而言,我會為此應用程序使用LinkedBlockingQueue - 使用鏈表的優勢在於沒有設置最大容量,並且隨着隊列縮小,內存使用量會減少。

與“少詞差異”相關:Queue和BlockingQueue是接口,而ArrayBlockingQueue是一個嵌入BlockingQueue接口的類。

您應該主要在ConcurrentLinkedQueue和ArrayBlockingQueue / LinkedBlockingQueue之間進行選擇。

前者為您提供無限隊列(不限制大小),后者提供固定大小的隊列,等待存儲元素時隊列中的空間可用。

作為隊列+線程的替代方案,您可以考慮並發包中的Executor和Future接口,它們可能更容易用於實現客戶端 - 服務器模型。

使用更高級別的Executors.newSingleThreadExecutor()

對於您的場景,您需要的是一個線程安全隊列,例如ConcurrentLinkedQueue 關於Queue和BlockingQueue的其他問題。 基本上有以下類型的隊列實現:

阻塞:阻塞直到操作( put(),take()等)可以使用可選的超時。 非阻止:操作立即完成

綁定:隊列中的項目數有上限

無約束:隊列中的項目數沒有限制。

對於ArrayBlockingQueue,它由一個Array備份,而LinkedBlockingQueue由LinkedList備份。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM