Java NIO Selector详解(含多人聊天室实例)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本文由我司收集整编,推荐下载,如有疑问,请与我司联系
Java NIO Selector 详解(含多人聊天室实例)2017/01/23 0 一、Java NIO 的核心组件Java NIO 的核心组件包括:Channel(通道),Buffer(缓冲区),Selector(选择器),其中Channel 和Buffer 比较好理解简单来说NIO 是面向通道和缓冲区的,意思就是:数据总是从通道中读到buffer 缓冲区内,或者从buffer 写入到通道中。

关于Channel 和Buffer 的详细讲解请看:Java NIO 教程
二、Java NIO Selector1. Selector 简介选择器提供选择执行已经就绪的任务的能力. 从底层来看,Selector 提供了询问通道是否已经准备好执行每个I/O 操作的能力。

Selector 允许单线程处理多个Channel。

仅用单个线程来处理多个Channels 的好处是,只需要更少的线程来处理通道。

事实上,可以只用一个线程处理所有的通道,
这样会大量的减少线程之间上下文切换的开销。

在开始之前,需要回顾一下Selector、SelectableChannel 和SelectionKey:
选择器(Selector) Selector 选择器类管理着一个被注册的通道集合的信息和它们的
就绪状态。

通道是和选择器一起被注册的,并且使用选择器来更新通道的就绪状
态。

当这么做的时候,可以选择将被激发的线程挂起,直到有就绪的的通道。

可选择通道(SelectableChannel) SelectableChannel 这个抽象类提供了实现通道的可选择性所需要的公共方法。

它是所有支持就绪检查的通道类的父类。

因为
FileChannel 类没有继承SelectableChannel 因此是不是可选通道,而所有socket 通道都是可选择的,包括从管道(Pipe)对象的中获得的通道。

SelectableChannel 可以被注
册到Selector 对象上,同时可以指定对那个选择器而言,那种操作是感兴趣的。


个通道可以被注册到多个选择器上,但对每个选择器而言只能被注册一次。

选择键(SelectionKey) 选择键封装了特定的通道与特定的选择器的注册关系。


择键对象被SelectableChannel.register()返回并提供一个表示这种注册关系的标记。

选择键包含了两个比特集(以整数的形式进行编码),指示了该注册关系所关心的通
道操作,以及通道已经准备好的操作。

下面是使用Selector 管理多个channel 的结构图:。

相关文档
最新文档