zoukankan      html  css  js  c++  java
  • 简单理解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进阶架构
  • 相关阅读:
    动态传参
    函数的介绍
    文件的操作
    send email with formatted table
    minimize and close window with customed winform
    python algorithm
    something important about docker
    book list
    which language is suitable for what to do
    Find Duplicate Items in list fast
  • 原文地址:https://www.cnblogs.com/shangdongbin/p/7699110.html
Copyright © 2011-2022 走看看