了解NIO
了解NIO
NIO
概述
NIO的作用:传输数据
分类:
BIO - Blocking IO - 同步阻塞式IO
NIO - New IO - NonBlocking IO - 同步非阻塞式IO - JDK1.4
AIO - Asynchronous IO - 异步非阻塞式IO - JDK1.7 - AIO是基于NIO进行了改进,也把AIO称之为NIO.2;因为NIO出现时间比较早,所以市面上很多框架的底层都是基于NIO构建,对NIO进行了改进,导致AIO在市面上的占有率并不高
基本概念:
同步和异步:如果一个对象或者一段逻辑在一个时间段内允许被多个线程同时使用,此时称之为异步;如果一个对象或者一段逻辑在一个时间段内只允许被一个线程使用,此时称之为同步
阻塞和非阻塞:一个线程在没有获取到结果之前会持续等待也不执行逻辑也不抛出异常,这种现象称之为阻塞;一个线程即使没有获取到结果也会继续往下执行或者抛出异常,此时称之为非阻塞
NIO的三大组件:Buffer、Channel、Selector
BIO的缺点
阻塞:导致任务的执行效率变低
一对一连接:每当客户端产生一个连接,服务器端都需要产生一个线程去处理这个连接;如果产生了大量的客户端连接,服务器需要产生大量线程去处理这些连接;服务器端所能产生和承载的线程数量是有限的,如果线程过多会导致服务器的卡顿甚至崩溃
如果客户端连接之后不做任何操作而是恶意保持连接,导致服务器端的线程无法释放;如果产生大量的恶意连接,导致服务器端的线程被大量占用
Buffer - 缓冲区
作用:存储数据
基于数组来实现的。Buffer针对基本类型来进行存储:ByteBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer,CharBuffer
重要位置:capacity >= limit >= position
capacity:容量位。用于表示缓冲区的容量,指定之后大小不能变
limit:限制位。用于限制position所能达到的最大下标。当limit和position重合的时候,就表示所有元素已经遍历完毕。当缓冲区刚创建的时候,limit默认和capacity重合
position:操作位。用于指向要读写的位置的。在缓冲区刚创建的时候,position默认为0。当对缓冲区进行读写操作的时候,position自动后挪
Channel - 通道
作用:传输数据
Channel在传输的时候是针对缓冲区进行操作
常用的Channel
文件:FileChannel
UDP:DatagramChannel
TCP:SocketChannel,ServerSocketChannel
Channel默认是阻塞的,手动设置为非阻塞
Channel可以实现双向传输
Selector - 多路复用选择器
作用:针对通道的指定事件来进行选择
Selector在使用的时候针对非阻塞通道进行操作