java NIO简介


java NIO的底层基础是IO多路复用技术。所谓多路复用,就是把多个IO的阻塞复用到同一个select的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求。与传统多线程模型比,IO多路复用的最大优势就是系统开销小,系统不需要创建新的额外的线程,也不需要维护这些线程,降低了系统的维护工作量,节省了系统资源。


IO多路复用的主要应用场景如下:

1,服务器需要同时处理多个处于监听状态或者多个连接状态的套接字。

2,服务器需要同时处理多种网络协议的套接字。


在jdk1.4推出NIO之前,基于java的所有socket通信都采用了同步阻塞模式(BIO),这种方式效率很低,所以在大型的应用服务器都采用C或者C++语言开发,因为他们可以直接使用os提供的异步IO能力。当并发访问量增大,相应时间延迟增大之后,采用java BIO 开发的服务器软件只有通过硬件的不断扩容来满足高并发和低延迟,它极大的增加了企业成本。nio提供了非阻塞操作。jdk1.7之后提供的AIO提供了异步非阻塞操作。至于同步异步,阻塞非阻塞的概念,我有一篇相应的文章来说这个,这里不再赘述(http://blog.csdn.net/sddh1988/article/details/69097386)。


传统BIO编程:

网络编程的基本模型是client/server模型,也就是两个进程之间的相互通信。传统的BIO采取的一请求一应答模型。也就是说服务端要为每一个客户端请求创建一个单独的线程来处理。服务器抗并发的能力定格在服务器硬件创建线程的能力。因为一个线程只能处理一个客户端。有过ServerSocket编程经验的人可以理解这一点。

BIO不适合于处理长连接的场景,因为只要连接不关闭,那么服务端就会一直有个专门服务这个连接的线程。对于老的tomcat来说,为了克服这一点,采用了短连接技术,也就是一问一答,然后就把连接关闭了。


NIO编程:

NIO中有channel和selector的概念,两者是结合使用的。核心是selector,翻译为多路复用器。是跟操作系统打交道的,充分利用了操作系统的多路复用技术。提供选择已经就绪的任务的能力。具体就是不同的channel需要先注册到selector上面,然后selector不断的轮询channel的状态,一旦channel准备就绪,就通知channel端(具体是通过channel的key)。这里只是泛泛的谈NIO的原理,不会给出代码,原因是NIO编程难度大,出错概率高。现在几乎没有人会直接采用NIO来编程。都是通过第三方框架比如netty,mina。但是了解原理还是很重要的。


一个selector可以轮询成千上万个channel,没有上限。这个就是NIO比BIO先进的地方。服务端只用一个线程就应付了所有客户端的IO请求。当然,客户端是要阻塞等待的。只是服务端解放了。一旦数据准备好,服务端会与客户端进行通信。通信是通过管道(channel)进行的。服务端的selector一直在轮询,也就是说,无论客户端有多少,服务端只需要一个线程就可以与所有的客户端通信。这个线程在轮询结束后,对准备好的channel进行遍历。顺带着完成通信。如果要提供效率的话,那可以用多线程,所有准备好的channel,给一个线程。这样不会造成线程的阻塞,因为所有的线程channel都是就绪状态。











  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值