Java网络编程之非阻塞I/O

非阻塞I/O

本文参考了《Java网络编程案例》,若有错误的地方欢迎指出。
非阻塞I/O在编程逻辑上与阻塞I/O一致,只是把Socket、ServerSocket换成了对应的通道
Java基本I/O都是阻塞I/O,例如通过Socket来读数据,调用readLine()方法之后,如果没有数据到达,当前线程就会一直阻塞在readLine()方法中,直到有数据或者数据源关闭才返回。如果采用非阻塞I/O,当数据没有就绪时,readLine()方法立即返回,而不是让当前线程一直阻塞在readLine()方法中。
基本I/O流都是单向传输的,通道是双向的,而且通道既可以工作于阻塞模式,也可以工作于非阻塞模式。
通道通过Selector类和SelectionKey类,构建一种轮询机制,实现多通道并发模式的管理。

在这里插入图片描述
非阻塞I/O的特点:
(1)单线程。NIO选择器的轮询机制,实现了单线程管理多通道的工作模式。多通道并发,避免了一客户一线程或者线程池对CPU的开销
(2)通道技术。一类是侦听通道ServerSocketChannel,另一类是数据通道SocketChannel。侦听通道只处理连接,所有客户机都需要通过侦听通道连接到服务器,在连接成功的同时,侦听通道开通一个为客户服务的数据通道。数据通道只负责数据传输,与客户机一一对应。
(3)缓冲区技术。NIO是基于通道和缓冲区进行操作,数据总是从通道写入到缓冲区中,或者从缓冲区读取到通道中。
(4)选择器。JavaNIO引入了选择器的概念,选择器用于侦听多个通道的事件,例如连接到达、数据到达等,这也是单线程可以管理多数据通道的关键。选择器就像uohe调度机构,所有的通道,都要向选择器注册,选择器会向每个通道颁发一个令牌,令牌是用SelectionKey类来定义的。
(5)令牌。每个通道都跟有一个SelectionKey,这是通道向选择器注册时创建的令牌,专为沟通当前通道和选择器服务。当侦听通道中有连接到达时,该通道所属令牌就会设置其OP_ACCEPT字段的值位就绪,当数据通道有数据到达事件发生时,该通道所属令牌就会设置其OP_READ字段的值为就绪,在每个选择器轮询周期,选择器通过查阅各令牌的状态决定调度和运行策略。

代码链接:
https://github.com/hzulwy/private-project/blob/master/%E9%9D%9E%E9%98%BB%E5%A1%9EIO.rar

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值