2014-04-15 37 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