2019-04-30——Java NIO

经典java IO库

  • IO是面向流的,NIO是面向缓冲区的
  • 对于经典的IO除了Buffered开头的类,其他均没有加缓冲区,除非手动添加缓冲区
byte[] buffer = new byte[64];
inputStream.read(buffer);
  • 经典io是标准的同步阻塞模型,即在read的过程中,会阻塞当前线程,直到取完数据。

NIO

NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector。传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。

IO的模型

  • 同步阻塞
    同步是对于线程而言的,如果进行IO的操作是当前线程,则为同步的,所以同步阻塞会导致当前线程阻塞,一般来说java中会开一个独立的线程进行同步阻塞的操作,以免程序假死。这是经典模型。

    image.png

    image.png

  • 同步非阻塞
    同样是在一个线程中,不同的在于调用read()方法后立即返回,不阻塞。到底有没有获取数据,仍然需要我们在当前线程中判断read()的返回值,直到read()到值时再进行其他操作。与同步阻塞相比,阻塞的权限交给了代码编写者,同步阻塞是由jvm进行的阻塞(可能描述不标准),而同步非阻塞,其实还是需要我们在当前线程中轮训是否获取数据了,阻塞权交给了程序员。

    image.png

    image.png

  • IO多路复用
    IO多路复用模型使用了Reactor设计模式实现了这一机制。

    image.png

    image.png

  • 信号驱动异步I/O模型

    image.png

  • 异步IO
    异步IO模型使用了Proactor设计模式实现了这一机制

    image.png

    image.png

首先一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作。

  • 同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO复用、信号驱动IO都是同步IO,如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。
  • 阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。

作者:好好学习312
来源:CSDN
原文:https://blog.csdn.net/u014507083/article/details/73784898
版权声明:本文为博主原创文章,转载请附上博文链接!


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容