龙空技术网

JavaNIO是什么?

兔子六号 38

前言:

此刻兄弟们对“javanio是啥有什么用”可能比较关切,小伙伴们都需要分析一些“javanio是啥有什么用”的相关资讯。那么小编在网摘上收集了一些对于“javanio是啥有什么用””的相关文章,希望朋友们能喜欢,姐妹们一起来了解一下吧!

问:JavaNIO是什么?

答:在非阻塞IO(NonblockingIO,NIO)出现之前,Java是通过传统的Socket来实现基本的网络通信功能的。以服务器端为例,其实现基本流程如下图所示:

如果客户端还没有对服务器端发起连接请求,那么accept就会阻塞(阻塞指的是暂停一个线程的执行以等待某个条件发生,例如某资源就绪)。如果连接成功,当数据还没有准备好时,对read的调用同样会阻塞。当要处理多个连接时,就需要采用多线程的方式,由于每个线程都拥有自己的栈空间,而且由于阻塞会导致大量线程进行上下文切换,使得程序的运行效率非常低下,因此在J2SE1.4中引入了NIO来解决这个问题。

NIO通过Selector、Channel和Buffer来实现非阻塞的IO操作,其实现原理如下图所示:

NIO非阻塞的实现主要采用了Reactor(反应器)设计模式,这个设计模式与Observer(观察者)设计模式类似,只不过Observer设计模式只能处理一个事件源,而Reactor设计模式可以用来处理多个事件源。

在上图中,Channel可以被看作一个双向的非阻塞的通道,在通道的两边都可以进行数据的读写操作。Selector实现了用一个线程来管理多个通道(采用了复用与解复用的方式使得一个线程能够管理多个通道,即可以把多个流合并成为一个流,或者把一个流分成多个流的方式),它类似于一个观察者。在实现时,把需要处理的Channel的IO事件(例如connect、read或write等)注册给Selector。Selector内部的实现原理为:对所有注册的Channel进行轮询访问,一旦轮询到一个Channe1有注册的事件发生,例如有数据来了,它就通过传回Selection⁃Key的方式来通知开发人员对Channe1进行数据的读或写操作。Key(由SelectionKey类表示)封装一个特定Channe1和一个特定的selector之间的关系。这种通过轮询的方式在处理多线程请求时不需要上下文的切换,而采用多线程的实现方式在线程之间切换时需要上下文的切换,同时也需要进行压栈与弹栈操作。因此,NIO有较高的执行效率。

Buffer用来保存数据,可以用来存放从Channe1读取的数据,也可以存放使用Channe1进行发送的数据。Java提供了多种不同类型的Buffer,例如ByteBuffer、CharBuffer等,通过Buffer,大大简化了开发人员对流数据的管理。

NIO在网络编程中有着非常重要的作用,与传统的Socket方式相比,由于NIO采用了非阻塞的方式,在处理大量并发请求时,使用NIO要比使用Socket效率高出很多。

标签: #javanio是啥有什么用