场景:IO适用于大而少,NIO适用于小而多

转载:https://www.cnblogs.com/kzfy/p/5063467.html

传统的socket IO中,需要为每个连接创建一个线程,当并发的连接数量非常巨大时,线程所占用的栈内存和CPU线程切换的开销将非常巨大。使用NIO,不再需要为每个线程创建单独的线程,可以用一个含有限数量线程的线程池,甚至一个线程来为任意数量的连接服务。由于线程数量小于连接数量,所以每个线程进行IO操作时就不能阻塞,如果阻塞的话,有些连接就得不到处理,NIO提供了这种非阻塞的能力。

小量的线程如何同时为大量连接服务呢,答案就是就绪选择。这就好比到餐厅吃饭,每来一桌客人,都有一个服务员专门为你服务,从你到餐厅到结帐走人,这样方式的好处是服务质量好,一对一的服务,VIP啊,可是缺点也很明显,成本高,如果餐厅生意好,同时来100桌客人,就需要100个服务员,那老板发工资的时候得心痛死了,这就是传统的一个连接一个线程的方式。

老板是什么人啊,精着呢。这老板就得捉摸怎么能用10个服务员同时为100桌客人服务呢,老板就发现,服务员在为客人服务的过程中并不是一直都忙着,客人点完菜,上完菜,吃着的这段时间,服务员就闲下来了,可是这个服务员还是被这桌客人占用着,不能为别的客人服务,用华为领导的话说,就是工作不饱满。那怎么把这段闲着的时间利用起来呢。这餐厅老板就想了一个办法,让一个服务员(前台)专门负责收集客人的需求,登记下来,比如有客人进来了、客人点菜了,客人要结帐了,都先记录下来按顺序排好。每个服务员到这里领一个需求,比如点菜,就拿着菜单帮客人点菜去了。点好菜以后,服务员马上回来,领取下一个需求,继续为别人客人服务去了。这种方式服务质量就不如一对一的服务了,当客人数据很多的时候可能需要等待。但好处也很明显,由于在客人正吃饭着的时候服务员不用闲着了,服务员这个时间内可以为其他客人服务了,原来10个服务员最多同时为10桌客人服务,现在可能为50桌,60客人服务了。

这种服务方式跟传统的区别有两个:

1、增加了一个角色,要有一个专门负责收集客人需求的人。NIO里对应的就是Selector。

2、由阻塞服务方式改为非阻塞服务了,客人吃着的时候服务员不用一直侯在客人旁边了。传统的IO操作,比如read(),当没有数据可读的时候,线程一直阻塞被占用,直到数据到来。NIO中没有数据可读时,read()会立即返回0,线程不会阻塞。

NIO中,客户端创建一个连接后,先要将连接注册到Selector,相当于客人进入餐厅后,告诉前台你要用餐,前台会告诉你你的桌号是几号,然后你就可能到那张桌子坐下了,SelectionKey就是桌号。当某一桌需要服务时,前台就记录哪一桌需要什么服务,比如1号桌要点菜,2号桌要结帐,服务员从前台取一条记录,根据记录提供服务,完了再来取下一条。这样服务的时间就被最有效的利用起来了。

导读:

J2SE1.4以上版本中发布了全新的I/O类库。NIO库提供的一些新特性:非阻塞I/O,字符转换,缓冲以及通道。NIO和IO都在rt.jar包中。

一、NIO的简介
NIO包(java.nio.*)引入了四个关键的抽象数据类型,它们共同解决传统的I/O类中的一些问题。
1. Buffer:它是包含数据且用于读写的线形表结构。其中还提供了一个特殊类用于内存映射文件的I/O操作。
2. Charset:它提供Unicode字符串影射到字节序列以及逆影射的操作。
3. Channels:包含socket,file和pipe三种管道,它实际上是双向交流的通道。
4. Selector:它将多元异步I/O操作集中到一个或多个线程中(它可以被看成是Unix中select()函数或Win32中WaitForSingleEvent()函数的面向对象版本)。

最新文章

  1. Topology and Geometry in OpenCascade-Face
  2. Redis使用总结
  3. C/C++ 获取汉字拼音首字母
  4. jfinal对象封装Record原理
  5. jdbc调用存储过程的方法
  6. 2014 Multi-University Training Contest 6
  7. python 模拟浏览器
  8. CDN的原理及对SEO的影响
  9. sql service重置自动增长字段数字的方法
  10. HeapAnalyzer
  11. 解 自己关于 C# Button的Click事件的疑惑
  12. UVa 11747 - Heavy Cycle Edges
  13. JavaSE高级1
  14. 游记-HNOI2019
  15. 简单hibernate框架测试
  16. Kafka基本命令
  17. 设计shell脚本选项:getopt
  18. Js将数字转化为中文大写
  19. 解决webapi首次启动速度慢的问题 - z
  20. dubbo 框架和 tomcat 的比较

热门文章

  1. dnskeygen - 针对DNS安全性所生成的公共,私有和共享的密钥
  2. 穷举(四):POJ上的两道穷举例题POJ 1411和POJ 1753
  3. python基础一 day2 字符串操作
  4. Vue.js系列之vue-router(上) (转载自向朔1992)
  5. java中的缓存技术该如何实现
  6. 重载操作符 'operator'
  7. linux shell 自动判断操作系统release 然后连接FTP yum源的脚本
  8. python虚拟环境的搭建及作用
  9. ffmpeg mp4 mp3 wav flac webm aac ac3 ogg格式转换
  10. vue 项目规范