1.NIO简介

阻塞IO:

在进行同步I/O操作的时候,如果读取数据,代码会阻塞直到有可供读取的数据,写入调用将会阻塞直到数据能够写入。

传统的Server/Client模式会基于TPR,服务器给每个客户端请求建立一个线程,由该线程单独负责一个客户请求,这种模式带来的问题就是线程数量剧增,大量的线程会增加服务器的开销,为避免这个问题,现在大部分都采用了线程池模型,这也带来了新问题,如果用户数量超过了线程池中线程的数量,会导致超出数量的用户请求无法及时处理。

非阻塞IO(NIO):

NIO中采用了基于Reactor模式的工作方式,I/O调用不会被阻塞,相反是注册感兴趣的IO时间,如刻度数据到达,新的套接字连接等等,在发生特点时间时,系统通知我们,NIO中实现非阻塞IO的核心对象就是Selector,Selector就是注册各种IO事件的地方,而且当我们感兴趣的事件发生的时候,就是这个对象告诉我们所发生的事情。

 由上图可知,当读写等事件发生的时候,可以从Selector获取到对应的Key,从Key中能知道发生的事件和该事件的Channel通道以及客户端发送过来的数据。虽然非阻塞IO事件本身不阻塞,但是获取IO事件的select方法时需要阻塞等待的,与阻塞IO的区别是:

  • NIO阻塞在事件的获取上,没有事件就没有IO,从高层上来看IO就不阻塞了,NIO的本质时延迟IO操作到真正发生IO的时候
  • IO会阻塞在IO操作上,只要IO流一打开就一直等待IO操作

NIO的核心部分:Channels,Buffers,Selectors

Channel

和IO中的Stream是差不多的,只不过Stream是单向的,比如InputStream,OutputStream,但是Channel是双向的,既可以用来进行读的操作,又可以用来进行写的操作。NIO中的Channel的主要实现有FileChannel,DatagramChannel,SocketChannel和ServerSockeChannel,分别对应IO,UDP和TCP(Server和Client)

总结如下:

  • 既可以从通道中读取数据,又可以写数据到通道
  • 通道可以异步的读写
  • 通到中的数据总是要先读到一个Buffer,或总是要先从一个Buffer写入(也就是Buffer是操作Channel与基本数据之间的媒介)

Buffer

NIO中的关键Buffer有:ByteBuffer,CharBuffer,DoubleBuffer,FloatBuffer,IntBuffer,LongBuffer,ShortBuffer分别对应基本的数据类型

基本操作:

  • 将数据写入到缓冲区
  • 调用buffer.flip()反转读写模式
  • 从缓存区读取数据
  • 调用buffer.clear()或i这buffer.compact()清除缓冲区的内容

Selector

Selector运行单线程处理多个Channel,如果你的应用打开了多个通道,但是每个连接的流量都很低,使用Selector就会很方便,例如一个聊天服务器中,要使用Selector,得向Selector注册Channel,然后调用它的select方法,这个方法会一直阻塞到其余注册的通道有事件就绪,当这个方法返回,线程就可以处理这些事件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值