返回顶部
首页 > 资讯 > 精选 >NioEventLoop处理IO事件相关逻辑是什么
  • 272
分享到

NioEventLoop处理IO事件相关逻辑是什么

2023-06-29 16:06:47 272人浏览 八月长安
摘要

这篇文章主要介绍“NIOEventLoop处理io事件相关逻辑是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“NioEventLoop处理IO事件相关逻辑是什么”文章能帮助大家解决问题。NioE

这篇文章主要介绍“NIOEventLoop处理io事件相关逻辑是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“NioEventLoop处理IO事件相关逻辑是什么”文章能帮助大家解决问题。

NioEventLoop的run()方法:

protected void run() {    for (;;) {        try {            switch (selectStrategy.calculateStrategy(selectNowSupplier, hasTasks())) {                case SelectStrategy.CONTINUE:                    continue;                case SelectStrategy.SELECT:                    //轮询io事件(1)                    select(wakenUp.getAndSet(false));                    if (wakenUp.get()) {                        selector.wakeup();                    }                default:            }            cancelledKeys = 0;            needsToSelectAgain = false;            //默认是50            final int ioRatio = this.ioRatio;             if (ioRatio == 100) {                try {                    processSelectedKeys();                } finally {                    runAllTasks();                }            } else {                //记录下开始时间                final long iOStartTime = System.nanoTime();                try {                    //处理轮询到的key(2)                    processSelectedKeys();                } finally {                    //计算耗时                    final long ioTime = System.nanoTime() - ioStartTime;                    //执行task(3)                    runAllTasks(ioTime * (100 - ioRatio) / ioRatio);                }            }        } catch (Throwable t) {            handleLoopException(t);        }        //代码省略    }}

我们首先看 if (ioRatio == 100) 这个判断, ioRatio主要是用来控制processSelectedKeys()方法执行时间和任务队列执行时间的比例, 其中ioRatio默认是50, 所以会走到下一步else

首先通过 final long ioStartTime = System.nanoTime() 记录下开始时间, 再通过processSelectedKeys()方法处理轮询到的key

processSelectedKeys()方法

private void processSelectedKeys() {     if (selectedKeys != null) {        //flip()方法会直接返回key的数组        processSelectedKeysOptimized(selectedKeys.flip());    } else {        processSelectedKeysPlain(selector.selectedKeys());    }}

我们知道selector通过Netty优化之后, 会初始化 selectedKeys这个属性, 所以这个属性不为空就会走到 processSelectedKeysOptimized(selectedKeys.flip()) 方法, 这个方法就是对应优化过的selector进行操作的

如果是非优化的selector, 则会进入 processSelectedKeysPlain(selector.selectedKeys()) 方法

selectedKeys.flip()为selectedKey中绑定的数组, 我们之前小节讲过selectedKeys其实是通过数组存储的, 所以经过select()操作如果监听到事件selectedKeys的数组就会有值

processSelectedKeysOptimized(selectedKeys.flip())方法

private void processSelectedKeysOptimized(SelectionKey[] selectedKeys) {    //通过for循环遍历数组    for (int i = 0;; i ++) {        //拿到当前的selectionKey        final SelectionKey k = selectedKeys[i];        if (k == null) {            break;        }        //将当前引用设置为null        selectedKeys[i] = null;        //获取channel(NioSeverSocketChannel)        final Object a = k.attachment();        //如果是AbstractNiochannel, 则调用processSelectedKey()方法处理io事件        if (a instanceof AbstractNioChannel) {            processSelectedKey(k, (AbstractNioChannel) a);        } else {            @SuppressWarnings("unchecked")            NioTask<SelectableChannel> task = (NioTask<SelectableChannel>) a;            processSelectedKey(k, task);        }        //代码省略    }}

首先通过for循环遍历数组中的每一个key, 获得key之后首先将数组中对应的下标清空, 因为selector不会自动清空, 这与我们使用原生selector时候, 通过遍历selector.selectedKeys()的set的时候, 拿到key之后要执行remove()是一个意思

之后获取注册在key上的channel, 判断channel是不是AbstractNioChannel, 通常情况都是AbstractNioChannel, 所以这里会执行 processSelectedKey(k, (AbstractNioChannel) a) 

processSelectedKey(k, (AbstractNioChannel) a)方法

private void processSelectedKey(SelectionKey k, AbstractNioChannel ch) {    //获取到channel中的unsafe    final AbstractNioChannel.NioUnsafe unsafe = ch.unsafe();    //如果这个key不是合法的, 说明这个channel可能有问题    if (!k.isValid()) {        //代码省略    }    try {        //如果是合法的, 拿到key的io事件        int readyOps = k.readyOps();        //链接事件        if ((readyOps & SelectionKey.OP_CONNECT) != 0) {            int ops = k.interestOps();            ops &= ~SelectionKey.OP_CONNECT;            k.interestOps(ops);            unsafe.finishConnect();        }        //写事件        if ((readyOps & SelectionKey.OP_WRITE) != 0) {            ch.unsafe().forceFlush();        }        //读事件和接受链接事件        //如果当前NioEventLoop是work线程的话, 这里就是op_read事件        //如果是当前NioEventLoop是boss线程的话, 这里就是op_accept事件        if ((readyOps & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0 || readyOps == 0) {            unsafe.read();            if (!ch.isOpen()) {                return;            }        }    } catch (CancelledKeyException ignored) {        unsafe.close(unsafe.voidPromise());    }}

我们首先获取和channel绑定的unsafe, 之后拿到channel注册的事件

我们关注

 if ((readyOps & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0 || readyOps == 0) 

这个判断, 这个判断相信注释上写的很明白, 如果当前NioEventLoop是work线程的话, 这里就是op_read事件, 如果是当前NioEventLoop是boss线程的话, 这里就是op_accept事件

然后会通过channel绑定的unsafe对象执行read()方法用于处理链接或者读写事件

关于“NioEventLoop处理IO事件相关逻辑是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: NioEventLoop处理IO事件相关逻辑是什么

本文链接: https://lsjlt.com/news/325618.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • NioEventLoop处理IO事件相关逻辑是什么
    这篇文章主要介绍“NioEventLoop处理IO事件相关逻辑是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“NioEventLoop处理IO事件相关逻辑是什么”文章能帮助大家解决问题。NioE...
    99+
    2023-06-29
  • Netty源码分析NioEventLoop处理IO事件相关逻辑
    目录NioEventLoop的run()方法:processSelectedKeys()方法processSelectedKeysOptimized(selectedKeys.fli...
    99+
    2024-04-02
  • PostgreSQL中插入数据时与WAL相关的处理逻辑是什么
    本篇内容主要讲解“PostgreSQL中插入数据时与WAL相关的处理逻辑是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PostgreSQL中插入数据时与W...
    99+
    2024-04-02
  • PHP文件上传处理逻辑是什么
    本文小编为大家详细介绍“PHP文件上传处理逻辑是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“PHP文件上传处理逻辑是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。文件名字处理文件名字得看业务要求。不需...
    99+
    2023-07-04
  • 关于thymeleaf判断对象是否为空的相关逻辑处理
    目录thymeleaf 判断对象是否为空有关逻辑场景一场景二Thymeleaf基础语法一、引用命名空间二、常用th标签三、Thymeleaf中的URL写法四、用Thymeleaf进行...
    99+
    2022-11-13
    thymeleaf判断对象 判断对象是否为空 thymeleaf判断对象为空
  • SAP gateway处理multiple key的逻辑是什么
    SAP gateway处理multiple key的逻辑是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。# Sent: Tuesday, January 20...
    99+
    2023-06-04
  • mysql中逻辑查询处理是什么意思
    这篇文章给大家分享的是有关mysql中逻辑查询处理是什么意思的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。 查询处理可以分为逻辑查询处理和物理查询处理...
    99+
    2024-04-02
  • 什么是LVM逻辑卷管理
    什么是LVM逻辑卷管理,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。  Linux因其开放性而受到许多企业和开发者的喜爱,it互联网市场相应的也增加了对Linu...
    99+
    2023-06-05
  • todomvc组件编写逻辑是什么
    TodoMVC 是一个用来演示各种前端框架编写 todo 应用的开源项目。在 TodoMVC 中,每个框架都有自己的组件编写逻辑,但...
    99+
    2023-10-23
    todomvc
  • PostgreSQL在执行逻辑优化中相关的数据结构是什么
    这篇文章主要介绍“PostgreSQL在执行逻辑优化中相关的数据结构是什么”,在日常操作中,相信很多人在PostgreSQL在执行逻辑优化中相关的数据结构是什么问题上存在疑惑,小编查阅了各式资料,整理出简单...
    99+
    2024-04-02
  • 怎么使用API网关处理SQL拼接逻辑
    使用API网关处理SQL拼接逻辑的一般步骤如下: 创建一个API端点,接收客户端请求并将请求转发给后端服务。 在API网关中配置一...
    99+
    2024-04-29
    SQL
  • PostgreSQL中与AUTOVACUUM IO相关的参数是什么
    本篇内容介绍了“PostgreSQL中与AUTOVACUUM IO相关的参数是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔...
    99+
    2024-04-02
  • 什么是JavaScript事件处理
    这篇文章主要介绍“什么是JavaScript事件处理”,在日常操作中,相信很多人在什么是JavaScript事件处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是Jav...
    99+
    2024-04-02
  • python中逻辑回归算法的原理什么是
    本篇文章为大家展示了python中逻辑回归算法的原理什么是,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题...
    99+
    2023-06-14
  • java事件处理步骤是什么
    什么是事件?用户对组件的一个操作,称之为一个事件。事件源:能够产生事件的GUI组件对象。事件处理方法:能够接受,解析和处理事件类对象,实现与用户交互功能的方法。 事件监听器:可以处理事件的一个类。处理事件步骤:假设事件为XXXX向事件源注册...
    99+
    2015-07-22
    java教程 java 事件处理 步骤
  • vue.js中什么是事件处理器
    这期内容当中小编将会给大家带来有关vue.js中什么是事件处理器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。监听事件可以用v-on指令监听DOM事件来触发一些javas...
    99+
    2024-04-02
  • android事件处理流程是什么
    Android事件处理流程如下:1. 用户触发事件:用户在Android设备上进行了某种操作,如点击屏幕、滑动、按下按键等。2. 事...
    99+
    2023-09-13
    android
  • android事件处理机制是什么
    Android事件处理机制指的是Android系统中对用户输入事件以及其他系统事件的处理方式。Android系统中的事件处理机制主要包括以下几个部分:1. 事件触发:Android系统通过底层硬件驱动来获取用户输入事件,包括触摸事件、按...
    99+
    2023-08-11
    android
  • 关系数据库中数据逻辑结构指的是什么
    这篇文章主要介绍了关系数据库中数据逻辑结构指的是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。关系数据库中的数据逻辑结构是二维表格。关系...
    99+
    2024-04-02
  • MySQL数据库中逻辑架构的原理是什么
    MySQL数据库中逻辑架构的原理是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、笼统的逻辑架构先给出一张逻辑架构图,这...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作