java Nio

Selector 选择器

Buffer 缓冲器

Channel 通道

Selector是NIO的核心,是channel的管理者,通过执行select()阻塞方式,监听是否有channel准备好,一旦有数据可读,此方法的返回值是SelectionKey的数量。服务端通常会死循环执行select()方法,直到有channel准备就绪,然后开始工作,每个channel都会和Selector绑定一个事件,然后生成一个SelectionKey的对象。

channel和Selector绑定时,channel必须是非阻塞模式,而FileChannel不能切换到非阻塞模式,因为它不能套接字通道,所以FileChannel不能和Selector绑定事件。

在NIO中一共有四种事件:

1、SelectorKey.OP_CONNECT:连接事件

2、SelectorKey.OP_ACCEPT:接收事件

3、SelectorKey.OP_READ:读事件

4、SelectorKey.OP_WRITE:写事件

channel连接tcp端口和selector选择器,每次连接channel会新建一个吗,然后等准备好了就发送SelectionKey事件吗,有事件后channel读写到buffer吗?是这个顺序吗?

SelectionKey是Channel和Selector交互的核心组件,channel通过register绑定再selector上,并且注册为connect事件。Selector返回一个SelectionKey来检测channel事件,通过轮询判断事件类型,然后做相应操作,通过SelectionKey可以反过来拿到Channel和Selector。

tomcat NIO

connector

tomcat中Http11NioProtocol包含NioEndpoint实例,请求工作委托给NioEndpoint,tomcat在NioProtocol解析http请求时设计了三种线程,分别为Acceptor,Poller,Worker。

Acceptor run方法中包含执行过程。ServerSocketChannel执行阻塞接收操作,接收完成后setSocketOptions,设置为非阻塞,调用Poller的register方法,完成channel的注册。该方法的主要功能是利用传入的SocketChannel参数生成SecureNioChannel或者NioChannel,然后注册到Poller线程的selector中,注册中事件改为SelectionKey.OP_READ。

Poller线程,相当于Selector

Worker线程就是SocketProcessor用来处理实际业务请求,实现Runnable接口,通过线程池执行任务。

Container:

Container容器是所用servlet容器的父接口,也就是说作为一个servlet容器,首先必须要实现Container接口,每个tomcat服务器只能有唯一的根Container,Connector组件通过setContainer方法将Container容器和Connector关联起来。共有四种类型Container容器,分别对应不同概念的层次,每一层之间是父子的关系。

1、Engine:整个Catalina servlet引擎,标准实现为StandardEngine。

2、Host:表示包含一个或多个Context容器的虚拟主机,标准实现为StandardHost。

3、Context:表示一个web应用程序,一个Context可以有多个Wrapper,标准实现为StandardContext。

4、Wrapper:包装一个独立的Servlet容器,标准实现为StandardWrapper。

java nio 写事件_Java NIO相关推荐

  1. java nio 事件_Java NIO原理及实例

    Java NIO是在jdk1.4开始使用的,它既可以说成"新I/O",也可以说成非阻塞式I/O.下面是java NIO的工作原理: 1. 由一个专门的线程来处理所有的 IO 事件, ...

  2. java nio 追加写文件_Java NIO写入文件

    用NIO写文件,总结一下,主要有如下步骤: 1.打开通道. 2.包装到缓冲区. 3.写入文件. 4.不忘记关闭通道,关闭流.package what21.nio; import java.io.Fil ...

  3. java 双击触发事件_java鼠标双击事件怎么实现

    很多人都学习过java,但是你知道java鼠标双击事件怎么实现吗,跟着学习啦小编一起学习ava鼠标双击事件. java鼠标双击事件的实现方法 鼠标的单双击事件在很多时候对我们帮助很大,但是在JAVA中 ...

  4. java nio 追加写文件_Java NIO在文件末尾追加数据

    [java]代码库import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import ja ...

  5. java 接口文件夹_Java NIO.2 使用Path接口来监听文件、文件夹变化

    Java7对NIO进行了大的改进,新增了许多功能: •对文件系统的访问提供了全面的支持 •提供了基于异步Channel的IO 这些新增的IO功能简称为 NIO.2,依然在java.nio包下. 早期的 ...

  6. java nio底层实现_Java NIO 底层原理

    一.概念说明 1.内核态(内核空间)和用户态(用户空间)的区别和联系? 用户空间是用户进程所在的内存区域,系统空间是操作系统所在的内存区域.为了保证内核的安全,处于用户态的程序只能访问用户空间,而处于 ...

  7. java nio 如何使用_Java NIO 系列教程(转)

    原文中说了最重要的3个概念, Channel 通道 Buffer 缓冲区 Selector 选择器 其中Channel对应以前的流,Buffer不是什么新东西,Selector是因为nio可以使用异步 ...

  8. java nio.2群发_JAVA NIO TCP SOCKET 聊天群发

    以前都是用一般的socket编程,用线程来控制.最近突然用nio来做些东西. nio的好处我来说一下:第一,读写都是基于块的,效率高.第二,通过引入selector,简化了网络编程模型,异步非阻塞. ...

  9. java selector 源码_Java NIO核心组件-Selector和Channel

    昨天我们介绍了一下SelectorProvider和IO multiplexing.特别是IO multiplexing中的epoll系统调用,是Linux版本的Java的NIO的核心实现. 那今天我 ...

最新文章

  1. 5折交叉验证_交叉验证:评估模型表现
  2. java exception源码_Java异常之 Error 和 Exception
  3. js new Date()不带时分秒时,时间变了 问题解决
  4. 人造神经元成功操纵植物,让捕蝇草强行闭合,脑机接口新思路打开丨Nature子刊...
  5. C#中调用API函数RegisterHotKey注册多个系统热键
  6. 解读GAN及其 2016 年度进展
  7. OD使用教程3(下) - 调试篇03|解密系列
  8. ​上海AI Lab罗格斯大学港中文提出CLIP-Adapter,用极简方式微调CLIP中的最少参数!...
  9. 中心对称又是轴对称的图形_2020广东省考行测备考:图形推理之对称知多少
  10. 如何在 16 英寸 MacBook Pro 内置或独立显示器上更改刷新率?
  11. mysql数据库基本知识
  12. latex表格自动换行
  13. 【百问网智能家居---基于单片机最小系统STM32F103C8T6_MINI的入门学习】
  14. 1小时赚300块,不打代码帮人做个吃鸡网页 [IVX实战第3篇]
  15. ctfshow 做题 萌新 模块(1)
  16. win10系统登录和服务器,win10系统如何登录服务器地址
  17. 我在绑定微信账号时出现了问题,提示该微信已绑定其他账号
  18. 电脑配件 - 如何选择电脑显示屏幕 - 学习/实践
  19. [增强现实]Unity制作AR增强现实--茶壶(亲测)
  20. JavaSE实现桌面屏幕下雪功能

热门文章

  1. Flutter 构建完整应用手册-动画
  2. scrapy_redis使用
  3. 阿里云首席架构师唐洪:拥抱开源的云端更具生命力
  4. Action Golf 四个魔法球实战训练系列_huatuo_新浪博客
  5. CSS background 之设置图片为背景技巧
  6. 数据类型中的零碎基础知识
  7. Session和几种状态保持方案理解
  8. VC++6.0如何删除文件
  9. Winform/WPF实例中的相互操作
  10. Python实现图片识别加翻译,高薪必备技能