简单理解NIO

非阻塞的IO通信思想
IO和NIO的比较:
1,IO只能实现阻塞式的网络通信;NIO能实现非阻塞的网络通信
2,标准IO是基于字节/字符流进行操作;而NIO是基于通道--Channel进行操作的。
3,流的读写通常是单向的,要么输入,要么输出,不能既是输入流又是输出流;通道是双向的,既可以写数据到通道,也可以从通道读取数据。
 
java NIO三个重要组成
Channel---通道,Buffer---缓冲区,Selector---选择器
 
Channel:
    1,传统IO中,Stream是单向的,比如inputStream只能读,outputStream只能写
            而Channel双向的。
    2,具体常见的实现通道有
        FileChannel,SocketChannel,ServerSocketChannel,DatagramChannel等,跟具体的实现流FileinputStream....节点流包装流缓冲流等等功能类似。
 
Buffer:
    NIO中非常重要的一个,实际上是一个容器,是一个连续数组。在NIO中所有数据的读和写都离不开Buffer。       在NIO中,读取的数据只能放到Buffer中,同样的,写入的数据也是先写入Buffer中。

 

 
简单来看,就是想使用Channel传递数据,必须先把数据丢进Buffer里。
在NIO中,buffer是一个顶层父类,是一个抽象类,常用的Buffer的子类:
    ByteBuffer,IntBuffer,CharBuffer,LongBuffer,DoubleBuffer,FloatBuffer,ShortBuffer等。
 
Selector:
    用来轮询每个注册的Channel,一旦发现Channel有注册的事件发生,便获取事件进行处理。
    以前传统的socket编程时,accept方法会一直阻塞,直到有客户端请求的到来,并返回socket进行相应的处理。NIO提供了更好的解决方案,Selector选择器能够检测多个注册的通道上是否有事件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理,这样,只是用一个单线程就可以管理多个通道,也就是管理多个连接。这样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,大大减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线程,并且避免了多线程之间上下文切换导致的开销,并且是按照顺序处理,基于缓冲区和通道来传输和保存数据。
    与selector有关的一个关键类是SelectionKey,一个SelectionKey表示一个到达的事件,这两个类构成了服务端处理业务的关键逻辑
 
取自头条号:java进阶架构

转载于:https://www.cnblogs.com/shangdongbin/p/7699110.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值