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可以做到一个线程来处理多个操作。

猜你喜欢

转载自www.cnblogs.com/cokeHuan/p/12506116.html
今日推荐