面经·Java·(B)IO/NIO/AIO

Java中高手加QQ群498238384 备注:Java中高手- 呢称

如果对您有帮助,麻烦在右边点个赞哦~~

  • 什么是IO、NIO、AIO?
  • 讲一讲Channel 和 Buffer
  • 讲一讲selector
  • directBuffer和buffer的区别

  • 什么是IO、NIO、AIO?
    • NIO 指新IO,核心是非阻塞,解决传统IO的阻塞问题。操作对象是Buffer

      • 其实NIO的核心是IO线程池,一定要记住这个关键点。

      • NIO中的IO多路复用调用系统级别的select和poll模型,由系统进行监控IO状态,避免用户线程通过反复尝试的方式查询状态

    • AIO即Asynchronous I/O(异步非阻塞 I/O),这是Java 1.7引入的NIO 2.0中用到的。

  • 讲一讲Channel 
    • 一个Channel(通道)代表和某一实体的连接,这个实体可以是文件、网络套接字等。既可以读又可以写。而流是单向的。

      •  
  • 讲一讲selector
    • Selector 为Channel服务,Channel为要访问的数据服务。

    • selector采集各个channel的状态(或者说监听事件:

      • Accept:有可以接受的连接
      • Connect:连接成功
      • Read:有数据可读
      • Write:可以写入数据了
      • 程序员通过将通道注册到选择器,并设置好关心的事件,然后就可以通过调用select()方法,静静地等待事件发生。 避免了反复主动尝试Read()、write()、accept()、connnect()操作。

        作用举例:避免因为没有数据到达而反复尝试read().(耗费CPU)。

    • 为什么要用selector,类似于为什么要select的问题

      • 前文说了,如果用阻塞I/O,需要多线程(浪费内存)如果用非阻塞I/O,需要不断重试(耗费CPU)。Selector的出现解决了这尴尬的问题,非阻塞模式下,通过Selector,我们的线程只为已就绪的通道工作(约等于已准备好的数据),不用盲目的重试了。比如,当所有通道都没有数据到达时,也就没有Read事件发生,我们的线程会在select()方法处被挂起,从而让出了CPU资源。

  • Buffer

    • Buffer是缓冲区,不像传统IO中那样直接使用byte数组,它是封装过的。

    • (注意:将Buffer数据 写入 通道是通道 读取 操作,从通道 读取 数据到Buffer是Buffer 写入 操作)

    • 与Java基本类型相对应,NIO提供了多种 Buffer 类型,如ByteBuffer、CharBuffer、IntBuffer等,区别就是读写缓冲区时的单位长度不一样(以对应类型的变量为单位进行读写)。

      Buffer中有3个很重要的变量,它们是理解Buffer工作机制的关键,分别是

      • capacity (总容量)
      • position (指针当前位置)
      • limit (读/写边界位置)
  • directBuffer和buffer的区别

猜你喜欢

转载自blog.csdn.net/wzwdcld/article/details/81571110