zoukankan      html  css  js  c++  java
  • Java NIO:IO与NIO的区别

     一、概念

       非阻塞IO本身并不会比阻塞式IO快,只是因为在高并发访问时,
       非阻塞IO能够一定程度上减少服务器瞬间的并发线程数,从而提高CPU执行效率。     
       NIO即New IO,这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
         New IO成功的解决了上述问题,它是怎样解决的呢?
         IO处理客户端请求的最小单位是线程
         而NIO使用了比线程还小一级的单位:通道(Channel)
        可以说,NIO中只需要一个线程就能完成所有接收,读,写等操作

    二、NIO和IO的主要区别

         下表总结了Java IO和NIO之间的主要区别:

    1、面向流与面向缓冲

         Java IO和NIO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。

    2、阻塞与非阻塞IO

         Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。

    3、选择器(Selectors)

         Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

    三、NIO和IO如何影响应用程序的设计

       无论您选择IO或NIO工具箱,可能会影响您应用程序设计的以下几个方面:

       1.对NIO或IO类的API调用。
       2.数据处理。
       3.用来处理数据的线程数。

  • 相关阅读:
    关于CI/CD/CD (Continuous Integration/Continuous Delivery/Continuous Deployment)
    linux bash变量替换(# ## % %% / //)
    Azure静态公网ip自助反解
    Hadoop HDFS HA启动出现两个StandBy NameNode
    yum反查某个命令或so库在哪个包里面
    Hadoop 新建集群namenode format
    命令行web客户端与HTTP REST API调试工具
    Linux下source文件两种方法
    Redis配置参数汇总
    Jenkins RestAPI调用出现Error 403 No valid crumb was included in the request
  • 原文地址:https://www.cnblogs.com/tinya/p/8892691.html
Copyright © 2011-2022 走看看