5. NIO

NIO是Java提供的非阻塞I/O库。

  • 阻塞/非阻塞:需要等待/无需等待操作完成。
  • 同步/异步:主动获取/接收通知操作结果。
  • NIO:同步非阻塞,发起操作后不必等待完成,但需要主动获取操作结果。

NIO库由三部分组成:

  • 通道:Channel
  • 缓冲区:Buffer
  • 多路复用器:Selector

NIO库中的I/O操作从Channel开始,Channel代表与外部设备(文件、套接字等)的一个连接,通过它读取和写入数据(全双工)。

NIO库中的所有数据都通过Buffer处理。读取数据时,先从Channel读取到Buffer,再通过Buffer操作数据;写入数据时,先写入到Buffer中,再通过Buffer写到Channel。

BIO下,I/O操作是阻塞的,一个连接占用一个线程,而线程是稀缺资源,导致能够同时处理的连接数有限。因此,BIO只适合连接数少的情况。NIO库使用I/O多路复用技术处理多连接轻操作场景。

首先创建一个多路复用器Selector,然后将Channel注册到Selector上,Selector会给每个Channel分配一个凭证SelectionKey。使用Selector#select()方法循环检测各Channel上是否有事件(可接受连接、可发起连接、可读、可写)就绪,返回有就绪事件的SelectionKey列表,从SelectionKey获取Channel和事件,进行I/O操作。

你可能感兴趣的:(5. NIO)