zoukankan      html  css  js  c++  java
  • Java开发基础知识之学习篇——理解NIO

    高并发引发的问题

    一个使用传统阻塞IO的系统,如果还是使用传统的一个请求对应一个线程的模式,一旦有高并发的大量请求,则会有如下问题的产生:

      1、线程不够用,不断的修改线程池配置,就算使用量线程池复用线程也无济于事。

      2、阻塞IO模式,会有大量的线程被阻塞,一致在等待数据,这个时候的线程被挂起,只能干等,CPU利用率低,吞吐量差。

      3、如果网络IO阻塞或者网络波动及故障等,线程阻塞的时间可能很长,整个系统也变得不可靠。

    什么是NIO?

    java.nio全称java non-blocking IO (new io),是指JDK1.4及以后版本里提供的新api,为所有的原始类型(Boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。

    HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,并且并发请求的数量比HTTP1.1大了好几个数据级。

    IO和NIO的区别?

    IO是面向流的、阻塞的,NIO则是面向块的、非阻塞的。

    怎么理解IO是面向流的、阻塞的?

    java1.4以前的IO模型,一个连接对应一个线程。

    原始的IO是面向流的,不存在缓存的概念。Java IO 面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存到任何地方。此外,它不能前后移动流中的数据,如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓存区

    java IO的各种流是阻塞的,这意味着当一个线程调用read或者write方法是,该线程被阻塞,直到有一些数据被读取,或数据完全写入,该线程在此期间就不能干任何事情了。

    怎么理解NIO是面向块的、非阻塞的?

    NIO是面向缓冲区的。数据读取到一个它稍后处理的缓冲器,需要时可在缓冲区中前后移动,这就增加了处理过程中的灵活性。

    java NIO 的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取,而不是保持线程阻塞,所以直至数据变得可以读取之前,该线程可以继续做其他事情。非阻塞写也是类似,一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。

    NIO可以做到一个线程来处理多个操作。

  • 相关阅读:
    Python Day 24 类属性与对象属性、初始化方法init、绑定方法与非绑定方法、OOP三大特性之继承、抽象与继承、存在继承关系后的属性查找、派生与覆盖、子类中重用父类的方法
    Python Day 23 xml模块 、面向对象
    Python Day 22 configparser模块、subprocess模块、xlrd模块、xlwt模块
    LeetCode 两个数之和
    python ATM + 购物车
    python Day 19 random、json、pickle、hashlib、hmac、shutil、shelve
    Python Day 18 time模块、datetime模块、os模块、os.path模块
    解释型语言和编译型语言的区别
    GCC和G++区别
    安装python+setuptools+pip+nltk
  • 原文地址:https://www.cnblogs.com/cokeHuan/p/12506116.html
Copyright © 2011-2022 走看看