Java学习手册:Java NIO


非阻塞IO(Nonblocking IO,NIO) 出现之前,Java是通过传统的Socket来实现基本的网络通信功能的。

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

NIO通过SelectorChannelBuffer来实现非阻塞的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效率高出很多。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值