多路复用器java代码 多路复用器java代码怎么写

Selector选择器Selector一般称 为 选择器,也可以翻译为多路复用器。它是Java NIO核心组件中的一个,用于检查一个或多个NIO Channel(通道)的状态是否处于可读、可写 。如此可以实现单线程管理多个channels,也就是可以管理多个网络链接
学习Selector之前,需要先了解阻塞IO和非阻塞IO的区别 。以烧水为例,出场人物:老王,普通水壶和响水壶 。
通过以上故事,我们得到了同步和异步 , 阻塞和非阻塞几个概念:
IO 包中的类是典型的阻塞设计,这无法发挥的性能,就需要使用多线程来解决阻塞问题。
在 NIO 中,Selector的作用就是用来轮询每个注册的Channel , 一旦发现Channel有注册的事件发生,便获取事件然后进行处理。
示例
Channel 必须是非阻塞的所以 FileChannel 不适用 Selector,因为 FileChannel 不能切换为非阻塞模式,更准确的来说是因为 FileChannel没有继承SelectableChannel 。Socket channel可以正常使用 。
SelectionKey 可以称为interest集合。意思是在 通过Selector监听Channel时对什么事件感兴趣。通道触发了一个事件意思是该事件已经就绪 。
如果需要不止一种事件,使用或运算符即可,如下:
一个SelectionKey键表示了一个特定的通道对象和一个特定的选择器对象之间的注册关系
java网络io模型有几种#BIO---Blocking IO
- 每个socket一个线程,读写时线程处于阻塞状态 。
优点:实现简单
缺点:无法满足高并发,高接入的需求
- 不使用线程池的BIO模型,除多路复用器java代码了无法满足高并发需求外,由于需要为每个请求创建一个线程,还可能因为接入大量不活跃连接而耗尽服务器资源 。
- 使用线程池的BIO模型,虽然控制了线程数量,但由于其本质上读写仍是阻塞的,仍无法满足高并发需求 。
#NIO---Non-Blocking IO(非阻塞IO)
##非阻塞IO和多路复用
非阻塞IO和多路复用实际上是两个不用的概念,由于两者通常结合在一起使用,因此两者往往被混为一谈 。下面我将试着分清这两个概念:
###非阻塞IO
与BIO相对应,非阻塞IO的读写方法无论是否有数据都立即返回,因此可以通过轮询方式来实现 , 但轮询方式的效率并不比BIO有显著提高,因为每个连接仍然需要占用一个线程 。下面是轮询方式实现的IO模式图:
###多路复用
- 多路复用结合非阻塞IO能够明显提高IO的效率 , 这也是Java1.4把非阻塞IO和多路复用同时发布的原因 。
- 多路复用的核心是多路复用器(Selector),它是需要操作系统底层支持的,简单的说,就是进程把多个socket和它们关心的事件(比如连接请求或数据已准备好)都注册在多路复用器上 , 操作系统会在事件发生时通知多路复用器,这样进程就可以通过多路复用器知道在那个socket上发生了什么时间 , 从而进行对应的处理 。
- 多路复用的优点在于只需要一个线程监测(阻塞或轮询方式均可)多路选择器的状态,只有在有事件需要发生时才会真正的创建线程进行处理 , 因此更适合高并发多接入的应用环境 。
- 在Linux系统下,多路复用的底层实现是epoll方法 , 与select/poll的顺序扫描不同,epoll采用效率更高的事件驱动方式,而且epoll方式并没有socket个数限制 。
##BIO和NIO的比较
- BIO适用于连接长期保持的应用,比如一个复杂系统中模块之间通过长连接来进行通信 。
- NIO加多路复用的模式更适合短连接、高并发、多接入的情形 , 比如网络服务器 。
##NIO网络编程的常用接口

推荐阅读