2009-05-06 332 views
16

我正在使用一個隊列來保存有關需要發送到遠程主機的消息的信息。在這種情況下,一個線程負責將信息放入隊列中,另一個線程負責從隊列中獲取信息併發送它。第二個線程需要定期檢查隊列中的信息。Java中的阻塞隊列的優點是什麼?

但後來我發現這是車輪:)我可以用一個阻塞隊列用於此目的的再造。

對上述應用程序使用阻塞隊列有什麼其他優點? (例:性能,可修改的代碼,任何特殊的技巧等)

回答

26

主要優點是BlockingQueue提供了一個正確的,線程安全的實現。開發人員已經實施了這個功能多年,但要正確使用它卻非常棘手。現在,運行時已經由併發專家開發,審查和維護了一個實現。

隊列的「阻塞」性質有幾個優點。首先,在添加元素時,如果隊列容量有限,則內存消耗也是有限的。另外,如果隊列消費者遠遠落後於生產者,則生產者自然會受到限制,因爲他們必須等待添加元素。從隊列中獲取元素時,主要優點是簡單;永遠等待是微不足道的,正確地等待指定的超時只是稍微複雜一點。

6

你消除阻塞隊列他們關鍵的是「輪詢」。這就是你說的地方

在這種情況下,第二個線程需要定期檢查隊列中的信息。

這可能是非常低效的 - 使用許多不必要的CPU時間。它也可能引入不必要的延遲。

12

一種阻塞隊列是當你試圖從中出列塊隊列,隊列爲空,或者如果您嘗試排隊的項目它和隊列已滿。試圖從空隊列中出隊的線程被阻塞,直到其他線程將一個項插入到隊列中。嘗試將隊列排入隊列中的線程會被阻塞,直到某個其他線程在隊列中產生空間爲止,或者通過將一個或多個項目出隊或完全清除隊列。