Java高并发服务器编程NIO(基础篇)

前言

为了实现更高的并发性能,避免单一访问阻塞通讯节点。在java中使用Channel的方式进行。利用Selector作为访问事件的触发,管理多个操作队列,如Read、Write、Connection、Accept等。
不同的操作分配给不同的线程进行。实现服务器的并发访问。

提供一个简单的设计思路。

线程职责接受事件
Accept #0启动服务器端口,监听客户传来的连接请求。接收请求以后,对客户的连接进行设置,将客户的OP_Read请求注册给Reader的SelectorSelectKey.OP_Accept
Reader #1阻塞式/非阻塞式侦听用于Read事件的Selector是否被选择。如果被选择,需要相应的读取操作,接收客户传来额数据SelectKey.OP_Read
Writer #2阻塞式/非阻塞式侦听用于Write事件的Selector是否被选择,这个Write事件可以是Reader线程触发的,也可以是另外的线程触发。SelectKey.OP_Write

各线程的共通处

  1. 都需要使用Selector.Open()初始化自身的Selector。这个Selector可以理解为一个队列。只要注册了线程的Selector的对应事件,就会触发这个线程的Selector.selecte()事件
  2. 线程每处理一个Selector.SelectedKey,需要使用迭代器的remove方法将这个被选择的Key清除,代表这个Key已经被处理过了

Accept线程

//后续补充

Read线程

//后续补充代码

Write线程

这个线程的Selector.select事件有两种触发方式

  1. 如上面所讲的,在将一个SocketChannel.key注册到Wirte线程的Selector时,会自动触发一次被选择事件。
  2. 如果已经注册给Write线程的Selector,这个时候可以调用SocketChannel.key.interestOps()方法,输入需要进行的操作,那么会持续触发Selector.selecte事件。只有使用SocketChannel.key.interestOps(0)清除才会停止选择。这意味和,如果SocketChannel.key已经注册给Write进程,且使用了SocketChannel.key.interestOps()唤醒某种操作。同样需要使用SocketChannel.key.interestOps(0)清除该唤醒
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值