上一篇只是简单的介绍了一下NIO中的Selector。
这里我还是想再详细点。
通过Selector.open()方法,我们可以创建一个选择器(selector)。
通过channel.register()方法,我们把channel注册到Selector中。
register()方法中的参数:第一个参数selector:创建的选择器;第二个参数指定了对channel的什么事件感兴趣(SelectionKey.OP_CONNECT 连接事件,SelectionKey.OP_ACCEPT 确定事件,SelectionKey.OP_READ 读事件,SelectionKey.OP_WRITE 写事件)。
一个channel只能注册到一个Selector上。
将channel注册到同一个Selector多次,那么相当于更新参数。
SelectionKey:把channel注册到Selector时(调用register方法),会返回SelectionKey对象,此对象包含了:感兴趣的事件集,就绪的事件,channel实例,selector实例,attached object。
Selector的基本使用流程:
1,通过Selector.open()打开一个Selector。
2,将Channel注册到Selector中,并设置需要监听的事件。
3,不断循环:
3-1 调用select()方法---阻塞。
3-2 调用selector.selectedKeys()获取SelectionKey。
3-3 迭代每一个selectedkey
3-3-1 判断哪些IO事件就绪。
3-3-1-1 说明一个如果是OP_ACCEPT事件:如果是OP_ACCEPT事件,就调用:
SocketChannel clientChannel = ((ServerSocketChannel) key.channel()).accept()
获取SocketChannel对象,将其设置为非阻塞后,注册到Selector中。
3-3-2 从selectedkey中获取对应的channel和附加对象。
3-3-3 根据业务更改selectedkey的监听事件(key.interestOps(OP_READ | SelectionKey.OP_WRITE);)。
3-3-4 将已经处理过的key从selectedkeys集合中删除。
分享到:
相关推荐
这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入掌握Java语言,并开启游戏开发之旅。资源包中包括: 游戏项目代码:精心挑选了多个经典的小游戏项目,如猜数字、坦克大战等,每个项目都有完整...
这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入掌握Java语言,并开启游戏开发之旅。资源包中包括: 游戏项目代码:精心挑选了多个经典的小游戏项目,如猜数字、坦克大战等,每个项目都有完整...
这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入掌握Java语言,并开启游戏开发之旅。资源包中包括: 游戏项目代码:精心挑选了多个经典的小游戏项目,如猜数字、坦克大战等,每个项目都有完整...
这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入掌握Java语言,并开启游戏开发之旅。资源包中包括: 游戏项目代码:精心挑选了多个经典的小游戏项目,如猜数字、坦克大战等,每个项目都有完整...
这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入掌握Java语言,并开启游戏开发之旅。资源包中包括: 游戏项目代码:精心挑选了多个经典的小游戏项目,如猜数字、坦克大战等,每个项目都有完整...
《Zbynek的Netty POF实验与概念证明——深入理解Java网络编程》 在Java领域,Netty作为一款高性能、异步事件驱动的网络应用...对于任何对Java网络编程感兴趣的人来说,深入研究这个项目都将是一次富有价值的学习之旅。
这次分享为你带来了丰富的Java语言游戏项目实战资源,让你在实践中深入掌握Java语言,并开启游戏开发之旅。资源包中包括: 游戏项目代码:精心挑选了多个经典的小游戏项目,如猜数字、坦克大战等,每个项目都有完整...
总结,Dubbo的源码解析是一场深入到服务治理核心的探索之旅,通过对Provider、Consumer、Registry、负载均衡、服务治理等模块的剖析,我们可以更清晰地理解Dubbo如何高效、稳定地支撑大规模分布式系统的构建。...
【标题】:深入理解JDK源码 在Java开发领域,深入阅读JDK源码是提升技术水平...总之,JDK源码阅读是一场深度技术探索之旅,它将帮助我们揭开Java语言的神秘面纱,提升我们的编程技艺,使我们成为更优秀的Java开发者。