Java NIO(同步非阻塞)时jdk1.4开始的,java提供了一系列改进的输入/输出的新特性。
NIO可以做到一个线程处理多个操作,假设有10000个请求过来,分配50或者100个线程来处理。不像之前的阻塞IO那样,非得分配10000个。
HTTP2.0使用多路复用技术,做到同一个连接并发处理多个请求,且并发请求的数量比HTTP1.1高几个数量级。
NIO的核心组件:
1、通道(Channel)
Channel在NIO中是一个接口
常用的Channel类有:FileChannel(用于文件读写),DatagramChannel(用于UDP的数据读写),ServerSocketChannel和SocketChannel(用于TCP数据读写)
2、缓冲区(Buffer)
注意:ByteBuffer支持类型化的put和get,put放入什么数据类型,get是使用相应的数据类型取出,否则可能报BufferUnderFlowException。
3、选择器(Selector)
Selector可以检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的处理。这样就可以只用一个线程去管理多个通道。
(1)每个channel都会对应一个buffer
(2)selector对应一个线程,一个线程对应多个channel(连接)
(3)程序切换到哪个channel是有事件(Event)决定的,selector会根据事件在各个通道上切换。
(4)buffer是一个内存块,底层是一个数组,且是双向的。
(5)channel是双向的。