Java学习手册:Java NIO,
Java学习手册:Java NIO,
在非阻塞IO(Nonblocking IO,NIO) 出现之前,Java是通过传统的Socket来实现基本的网络通信功能的。
在传统的Socket实现通信功能的过程中,以服务器端为例,如果客户端还没有对服务器端发起连接请求,那么accept就会阻塞(阻塞指的是暂停一个线程的执行以等待某个条件发送,例如某资源就绪)。如过连接成功,当数据还没有准备好时,对read的调用同样会阻塞。当要处理多个连接时,就需要采用多线程的方式,由于每个线程都拥有自己的栈空间,而且由于阻塞会导致大量线程进行上下文切换,使得程序的运行效率非常低下,因此在J2SE1.4中引入了NIO来解决这个问题。
NIO通过Selector、Channel和Buffer来实现非阻塞的IO操作。
Channel可以被看作一个双向的非阻塞的通道,在通道的两边都可以进行数据的读写操作。
Selector实现了用一个线程来管理多个通道(采用了复用与解复用的方式使得一个线程能够管理多个通道,即可以把多个流合并成为一个流,或者把一个流分成多个流的方式),它类似于一个观察者。在实现时,把需要处理的Channel的IO事件(例如connect、read或write等)注册给Selector。Selector内部的实现原理为:对所有注册的Channel进行轮询访问,一旦轮询到一个Channel有注册的事件发生,例如有数据来了,它就通过传回SelectionKey的方式来通知开发人员对Channel进行数据的读或写操作。Key(由SelectionKey类表示)封装在一个特定Channel和一个特定的selector之间的关系。这种通过轮询的方式在处理多线程请求时不需要上下文的切换,而采用多线程的实现方法在线程之间切换时需要上下文的切换,同时也需要进行压栈与弹栈操作。因此NIO有较高的执行效率。
Buffer用来保存数据,可以用来存放从Channel读取的数据,也可以存放使用Channel进行发送的数据。Java提供了多种不同类型的Buffer,例如ByteBuffer、CharBuffer等,通过Buffer,大大简化了开发人员对流数据的管理。
NIO在网络编程中有着非常重要的作用,与传统的Socket方式相比,由于NIO采用了非阻塞的方式,在处理大量并发请求时,使用NIO要比使用Socket效率高出很多。
相关文章
- 暂无相关文章
用户点评