Selector在Java中的优势是什么?

时间:2014-04-15 11:21:23

标签: java asynchronous io nio

据我所知,我们可以将所有SocketChannel注册到服务器端的一个Selector中,但为什么呢?将这些SocketChannel添加到ArrayList中有什么不同,然后我手动迭代这个List?

2 个答案:

答案 0 :(得分:1)

选择器提供低延迟控制传输。如果你定期醒来并走一个频道列表,那么你的平均延迟是T / 2,减少这种情况的唯一方法就是花更多的时间走在列表上;对于非常小的T你有效地忙着循环。使用选择器,平均延迟较小,并且没有浪费周期来维护或行走列表。

答案 1 :(得分:1)

选择器允许JVM实现通过将工作推送到适当的内核/驱动程序来有效地与操作系统select / epoll / kqueue(或等效)机制一起工作。这些函数的现代OS实现通常被认为是O(1)。

也就是说,Java本身可以"睡眠"直到底层操作系统发出一个或多个通道信号 - 通过选择器在Java NIO中配置和报告。

当使用选择器进行循环时,选择将&#34;阻止&#34;直到频道发生变化 - 因此与选择器保持一致可以有效地找到相关频道并进行处理。保持&#34; per-event&#34;上述目标的所有部分都是如此。处理O(c),其中c <&lt; n,处理n个频道时。