NIO中Selector的工作原理
在JDK1.4.2中加入了对NIO的支持,掌握其中的Selector个人认为是能实现好NIO的关键。
Selector是用来获取注册在其中的channel的相关事件的发生,也就是accept,read和write。selector中有3个key set。
key set:包含代表所有在其中注册的channel,可以通过selector.keys()得到。
selected-key set:包含所有被检测到有关注的操作已经就绪的key,通过selector.selectedKeys得到。
cancelled-key set:包含所有已经被cancel,但是还没有channel还没有deregister的key,这个集合是不能直接被访问的。
key通过调用channel的register方法被加入到key set中。被取消的key在select的时候会被从相应的key set中移除。
key set自身是不可以直接进行修改的。 无论是通过调用channel的close方法还是调用key的cancel方法,key都会被放置到canceled-key set中。取消的key会将其channel在下一次select时将注册撤销,同时将key从所有的key set中移除。
key在执行select操作时被加入到selected-key set中。在selected-key set中的key可以通过调用iterator的remove方法,将其从selected-key set中移除,不能通过其他的办法将其从selected-key set中移除。
通过selector的3个方法select(阻塞选择,直到有关心的事件发生时退出阻塞),selectNow(不阻塞选择),select(long)(指定超时选择,超时到达或者有关心事件发生时退出阻塞),来获取关心事件的发生。其执行步骤分为以下3步:
1、将存在于canceled-key set中的key从所有的key set中移除,撤销注册的channel,清空canceled-key set。
2、地层操作系统检查是否有关心的事件发生,当有关心的事件发生时,首先检查channel的key是否已经存在于selected-key set中,如果不存在,则将其加入到selected-key set中去,同时修改key的ready-operation set来表明当前ready的操作,而以前存在于ready-operation set中的信息会被删除。如果对应的key已经存在于selected-key set中,这直接修改其ready-operation set来表明当前ready的操作,删除原来ready-operation set中的信息。
3、如果在第二步中有加入到canceled-key set中的key,在这一步会执行第一步的操作。
selector自身是线程安全的,而他的key set却不是。在一次选择发生的过程中,对于key的关心事件的修改要等到下一次select的时候才会生效。 另外,key和其代表的channel有可能在任何时候被cancel和close。因此存在于key set中的key并不代表其key是有效的,也不代表其channel是open的。如果key有可能被其他的线程取消或关闭channel,程序必须小 心的同步检查这些条件。
阻塞了的select可以通过调用selector的wakeup方法来唤醒。
分享到:
相关推荐
本文将深入探讨Java NIO中的Selector机制,并通过源码分析来理解其实现原理。 Selector机制是Java NIO中的核心组件,它允许单线程同时监控多个通道(Channels)的状态变化,例如连接就绪、数据可读或可写等。这种...
首先,我们需要理解Selector的工作原理。Selector是一个多路复用器,它可以监控多个通道的事件状态,如连接就绪、数据可读或可写等。通过注册通道到Selector并设置感兴趣的事件,我们可以在一个循环中检查哪些通道...
### Java NIO的介绍及工作原理 #### 一、引言 Java NIO(New I/O)是Java 1.4版本引入的一个重要的I/O处理框架,它为Java应用程序提供了处理I/O操作的新方法。与传统的Java IO模型相比,NIO提供了一种更加高效的...
课程中的视频文件"Java基础第27天-04.NIO-Selector-Server-Client.avi"很可能包含了实际的代码演示和讲解,帮助学习者直观理解Selector的工作原理以及如何在Java中实现NIO服务器和客户端的交互。通过观看视频和动手...
#### 三、Selector的工作原理 Selector 的工作流程主要包括以下几个步骤: 1. **创建Selector**:首先需要创建一个 `Selector` 对象,这是整个流程的基础。 2. **注册Channel到Selector**:接着将需要监控的 ...
### Java NIO原理 图文分析及代码实现 #### 前言 在深入探讨Java NIO之前,我们先简要回顾一下NIO的概念及其引入的原因。随着互联网的发展,越来越多的应用程序需要处理高并发的网络连接请求。传统的阻塞I/O模型在...
Selector的工作原理: Selector通过注册Channel(通道)到自己身上,当注册的通道上发生指定的事件时,Selector会进行轮询,发现哪些通道已经准备好了相应的I/O操作。这样,服务器只需要一个线程就可以管理多个连接...
在Java NIO中,"新"主要体现在非阻塞和多路复用这两个特性上,这使得NIO更适合于高并发、低延迟的系统。 **Java IO原理:** Java IO基于流模型,分为输入流和输出流。流是一维数据序列,可以是从源到目标的单向流动...
NIO的核心概念和机制包括阻塞和非阻塞、同步和异步以及IO模型和选择器 Selector。 首先,阻塞与非阻塞关注的是进程访问数据时,数据是否准备就绪的处理方式。在阻塞模式下,当请求的数据没有准备好时,进程会停下来...
本文主要简单介绍NIO的基本原理,在下一篇文章中,将结合Reactor模式和著名线程大师Doug Lea的一篇文章深入讨论。 NIO主要原理和适用。 NIO 有一个主要的类Selector,这个类似一个观察者,只要我们把需要探知的...
NIO的核心概念包括通道(Channel)、缓冲区(Buffer)和选择器(Selector)。 1. **通道(Channel)**:在Java NIO中,通道代表了一个打开的I/O连接,如文件、套接字、网络流等。通道是双向的,数据可以从通道读取...
理解并掌握NIO的原理和使用,对于提升Java应用的性能和可扩展性至关重要。通过以上介绍的知识点,你可以开始编写基于NIO的应用,例如使用SocketChannel实现一个简单的非阻塞服务器。在实际编码时,参考博文链接中的...
本项目源码包含了NIO相关的实现,通过分析这些代码,我们可以深入了解NIO的工作原理和实际应用。 1. NIO基础概念 - Channel(通道):NIO的核心组件,它代表了数据传输的路径,如文件、套接字等。通道是双向的,...
开发者不仅需要深入理解MongoDB的数据模型和操作,还要熟练掌握Java NIO的原理和实践,才能充分发挥两者的优势。在实际项目中,可以根据具体需求选择合适的设计模式和最佳实践,以优化系统的性能和稳定性。
在Java编程领域,NIO(New Input/Output)是一个重要的概念,它提供了非阻塞I/O操作的能力,相比传统的BIO(Blocking I/O),在处理大量并发连接...通过这个项目,开发者可以深入理解NIO在实际应用中的工作原理和优势。
下面将详细介绍Java NIO的主要组件和工作原理,并结合这两个文件名推测它们可能包含的内容。 1. **Selector(选择器)**:选择器是NIO的核心组件,它能够监控多个通道(Channel)的状态变化,当某个通道准备进行...
#### NIO 包及其工作原理 为了克服传统I/O的局限性,Java NIO 提供了一种全新的数据读写模型,包括 Buffer(缓冲区)、Channel(通道)、Selector(选择器)三个核心组件,这些组件共同实现了非阻塞型I/O。 - **...
3. **Selector(选择器)**:Selector是NIO中的关键组件,它允许单个线程监控多个Channel上的事件。Selector通过轮询注册在其上的Channel,当某个Channel准备就绪(例如,有数据可读或可写)时,Selector会返回一个...
在Java编程领域,NIO(Non-blocking Input/Output,非阻塞I/O)是一种重要的I/O模型...通过阅读和分析代码,你可以更深入地理解NIO在实际应用中的工作原理,以及如何将其应用于实际项目中,提升服务器处理请求的能力。
Java NIO(New Input/Output)是自JDK 1.4版本开始引入的一种I/O模型,相较于传统的基于流的I/O(IO),NIO提供了一种面向块的、高效的数据...理解和掌握NIO的工作原理,能够帮助开发者编写出性能更好的Java应用程序。