什么是NIO
Posted lbzhu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是NIO相关的知识,希望对你有一定的参考价值。
早上占坑
BIO:一个线程接受一个请求,然后一直接待到处理完这个请求后再接待下一个请求。
普通的设计模式就是这种BIO模式,它的问题在于一个线程接待请求的全部处理过程,这样请求中有需要等待的操作后,它会闲下来等待,这样让线程闲下来是一个资源浪费。可以通过过程优化提高吞吐量。
NIO:将任务拆分为多个步骤,即将耗时处理的步骤和非耗时的任务分开,然后处理时每个线程不再负责接待请求的全部处理周期,而是只负责一个部分,这样负责非耗时处理的线程可以处理最大量的请求交给下一步的耗时线程,耗时线程又一直在处理耗时操作,这样就没有线程处于等待状态,也就没有资源的浪费,提高了吞吐量。核心,每个线程只负责处理单独的一部分任务,相当于将业务请求操作拆分后在流水线上处理。
异步:使用异步调用,可以大大地节省资源,因为异步调用后,线程不用等待耗时方法执行完毕,可以直接释放占用的cpu资源,等耗时方法执行完毕后回调的方式执行后续处理,这样不会让线程闲起来。
所以NIO+异步是提高吞吐量的利器。
示例:
服务器端有一个需要进行磁盘操作,然后数据处理,然后数据库操作的复杂业务接口。(或者需要反复进行数据库操作的业务接口,这种场景很常见)
当调用该接口时,如果一个线程负责一个请求,因为负责接收请求的线程数量是有限的,所以其它的请求只能排队等待处理完毕,而一个线程在处理这个请求中会有很多等待的过程,这个对线程处理能力是个浪费。
如果将请求处理拆分,分别由不同的线程完成不同的部分操作,这样,
异步提高吞吐量的原理,
因为异步一般是对耗时操作进行异步,主要是文件处理、数据库处理等,我们知道多线程的核心就是将CPU时间分为时间片来提高利用率,而其实这些文件处理、数据库处理会有自己的硬件处理,不需要CPU的干预,所以这时候释放时间片,不再占用时间片既不会影响这些任务的执行,又会节省出原本等待它执行完毕的时间片,所以提高了吞吐量。核心,这些耗时操作本身不需要CPU时间片就可以独立完成处理(对数据库来说不需要本地的CPU时间片资源)。
注意:
尽管NIO+异步能提高系统吞吐量,但其并不能让一个请求的等待时间下降,相反可能会增加等待时间。
注意:此处与多线程的作用相同,多线程并不能让一个请求的等待时间下降,相反可能会增加等待时间,但多线程能大大提高吞吐量。大大提高吞吐量,大大提高吞吐量,大大提高吞吐量,重要的事情说三遍。
(一直描述为多线程可以提高效率,其实不太直观,此处看到吞吐量三个字醍醐灌顶,豁然开朗,字字珠玑。。。)
明天servlet
以上是关于什么是NIO的主要内容,如果未能解决你的问题,请参考以下文章
java中的NIO和IO到底是什么区别?20个问题告诉你答案
java中的NIO和IO到底是什么区别?20个问题告诉你答案