Java NIO

Java NIO Selector实现原理

大兔子大兔子 提交于 2019-11-28 21:51:03
我们先看看传统I/O模型工作模式: 每条socket链路都由一个单独的线程负责处理,这对于大容量、高并发的应用程序来说,使用上千万个线程来处理请求几乎是不可能实现的。 多路复用IO模型的工作模式: 在多路复用IO模型中,只需要使用一个线程就可以管理多个socket,并负责处理对应I/O事件。这对于构建高并发、大容量的服务端应用程序来说是非常有意义。 从图中我们可以看出,多路复用IO模型中,使用了一个Selector对象来管理多个通道,这是实现单个线程可以高效地处理多个socket上I/O事件的关键所在。下面开始介绍Java NIO中Selector所实现的功能和原理。 Selector简介 简单来说,Selector就是SelectableChannel对象的多路复用器。通常调用Selector类的静态方法open来创建一个选择器对象,该方法使用系统默认SelectorProvider对象的openSelector方法来创建新的选择器。当然,还可以自定义实现SelectorProvider并重写openSelector方法来创建自定义选择器。 一个Channel对象注册到选择器之后,会返回一个SelectionKey对象,这个SelectionKey对象代表这个Channel和它注册的Selector间的关系。SelectionKey中维护着两个很重要的属性:interestOps