2014-04-15 58 views
0

據我所知,我們可以將所有SocketChannel註冊到服務器端的一個Selector中,但爲什麼?將這些SocketChannel添加到ArrayList中有什麼區別,然後我手動迭代這個List?Java中的Selector的優勢

+0

對於非阻塞事件,使用選擇器和監視器通道更容易。 –

回答

1

選擇器允許JVM實現與操作系統select/epoll/kqueue(或等效)機制高效地工作,方法是將工作推入適當的內核/驅動程序。這些功能的現代操作系統實現通常被認爲是O(1)。

也就是說,Java本身可以「休眠」,直到底層操作系統發出一個或多個通道的信號 - 這是通過選擇器在Java NIO中配置和報告的。

在與選擇器的循環中,選擇將「阻止」,直到存在頻道更改 - 因此與選擇器保持一致可以有效地找到相關頻道並處理它們。上述目標的一部分是保持「每事件」處理O(c),其中當處理n個通道時。

+0

嗨,是事件驅動的東西? – Alexis

+0

@亞歷克斯好吧,不錯。可以說Selector.select「等待事件」。 – user2864740

1

選擇器提供低延遲傳輸控制。如果你週期性地醒來並走過一個頻道列表,那麼你的平均延遲是T/2,減少這個的唯一方法就是花更多的時間走這個列表;對於非常小的T,你實際上正忙於循環。使用選擇器,平均延遲更小,沒有浪費維護或行走列表的週期。

+0

嗨,你的意思是如果我使用選擇器,我不需要無限循環迭代頻道列表,因爲Selector.select()會阻止循環,所以它減少了延遲和cpu資源的使用? – Alexis

+0

@Alexis,由於選擇器內置於操作系統的線程調度程序中,因此不需要權衡CPU使用率的延遲。 –

+0

感謝邁克〜:D – Alexis