NIO与传统IO的区别

转载 2014年06月20日 15:13:42

传统的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号桌要结帐,服务员从前台取一条记录,根据记录提供服务,完了再来取下一条。这样服务的时间就被最有效的利用起来了。

传统IO与NIO的比较

本文并非Java.io或Java.nio的使用手册,也不是如何使用Java.io与Java.nio的技术文档。这里只是尝试比较这两个包,用最简单的方式突出它们的区别和各自的特性。Java.nio提出了...
  • xianymo
  • xianymo
  • 2014年08月27日 12:36
  • 879

java nio 传统标准io socket 和nio socket比较与学习

在计算机系统中,最不可靠的就是网络请求,我们通过服务器端给客户端echo信息(客户端请求什么信息服务端就返回给客户端什么信息)。比较两种socket io的优劣。 一.标准io socket:    ...
  • sean417
  • sean417
  • 2017年04月09日 16:33
  • 1968

Java NIO 与 IO之间的区别

本文将NIO与IO进行了对比;介绍了NIO的一般使用方式
  • evan_man
  • evan_man
  • 2016年03月17日 09:01
  • 6224

Java的NIO及与IO区别

请参阅:Java NIO 系列教程NIO初窥 Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API NIO和IO主要区别 ...
  • u012440687
  • u012440687
  • 2016年09月25日 14:18
  • 745

传统Socket IO与NIO的比较

传统Socket IO特点1、传统IO有两个阻塞点,一个是接收客户端的阻塞点,另外一个是客户连接后接收消息的阻塞点2、在单线程下,一个Server只能为一个客户端服务,其他客户端想连接服务端必须等待前...
  • simba_1986
  • simba_1986
  • 2017年02月05日 17:25
  • 532

JAVA IO与NIO优劣浅析

NIO 设计背后的基石:反应器模式,用于事件多路分离和分派的体系结构模式。  反应器(Reactor):用于事件多路分离和分派的体系结构模式  通常的,对一个文件描述符指定的文件或设备, ...
  • zmx729618
  • zmx729618
  • 2016年07月08日 11:24
  • 1645

java中IO和NIO的区别和适用场景

这几天主要学习了NIO,因为之前对IO使用的也比较多,所以有一个简单的对比,并且把学习的成果记录下来。   java.NIO包里包括三个基本的组件 l buffer:因为NIO是基于缓冲的,...
  • zhansong_1987
  • zhansong_1987
  • 2015年05月20日 18:05
  • 3445

Java NIO 与IO的区别

在jdk1.4中,引入了NIO(NEW IO),其与传统的IO有着很大的差别,具体表现在:1:面向流与面向缓冲区传统IO面向流的,意味着每次从流中读取一个字节或多个字节,直到读取完所有字节,而没有缓冲...
  • qq_28051453
  • qq_28051453
  • 2017年05月11日 10:19
  • 403

Java IO:BIO和NIO区别及各自应用场景

引言BIO:同步阻塞式IO,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。NIO...
  • jiq408694711
  • jiq408694711
  • 2016年04月20日 22:57
  • 10077

IO 与 NIO :其本质就是阻塞和非阻塞的区别

阻塞概念:应用程序在获取网络数据的时候,如果网络传输数据很慢,那么程序就一直等着,知道传输完毕为止。 非阻塞概念:应用程序直接可以获取到已经转备好的数据,无需等待。 IO为同步阻塞形式,NIO为同...
  • z15732621582
  • z15732621582
  • 2017年12月30日 20:13
  • 116
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:NIO与传统IO的区别
举报原因:
原因补充:

(最多只允许输入30个字)