EventLoop execute() 怎么保证线程安全

2023-05-16

 

 

 

EventLoop 的 execute() 是在 SingleThreadEventLoop 中实现的。

    @Override
    public void execute(Runnable task) {
        if (task == null) {
            throw new NullPointerException("task");
        }

        boolean inEventLoop = inEventLoop();
        if (inEventLoop) {
            addTask(task);
        } else {
            startThread();
            addTask(task);
            if (isShutdown() && removeTask(task)) {
                reject();
            }
        }

        if (!addTaskWakesUp && wakesUpForTask(task)) {
            wakeup(inEventLoop);
        }
    }

如果是在 eventLoop 线程里,则直接插入到 任务队列,没有竞争问题。

如果不在则保证 eventLoop 线程已经启动了。然后在把任务添加到队列中。由于队列使用的是 LinkedBlockQueue 所以是线程安全的。

 

添加到队列之后结合 EventLoop 源码分析篇 相关文章,可以知道 eventloop 线程在每次处理完事件之后,会拿出一部分事件片处理队列里的 task。代码片段如下。 runAllTasks() 方法。

 //ioRatio 为 100 的时候就执行完 io 事件之后执行所有的 task
                if (ioRatio == 100) {
                    try {
                        processSelectedKeys();
                    } finally {
                        // Ensure we always run tasks.
                        runAllTasks();
                    }
                } else {
                    final long ioStartTime = System.nanoTime();
                    try {
                        //处理有事件发生的 key
                        processSelectedKeys();
                    } finally {
                        // Ensure we always run tasks.
                        final long ioTime = System.nanoTime() - ioStartTime;
                        //计算出执行普通任务占的百分比
                        runAllTasks(ioTime * (100 - ioRatio) / ioRatio);
                    }
                }

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EventLoop execute() 怎么保证线程安全 的相关文章

随机推荐

  • element表单多行数据自定义校验以及自定义传参

    场景说明 如下图 在form表单中迁移table表格 每行数据都要能编辑 单独校验 注释 此处的资源下拉框校验 还需要走异步请求获取结果 然后再对比校验 nbsp 话不多 上代码说明 1 首先获取的接口数据如下 form vmDataLis
  • Hbuilder修改项目git提交路径

    在git的使用中 xff0c 经常会出现git服务器IP地址变更的现象 xff0c 一旦服务器的IP地址有变化 xff0c 本地仓库的代码就和服务器失去了联系 xff0c 无法同步服务器的代码 这里说明一下 xff0c 如何修改git提交路
  • css3的clip-path方法剪裁实现(三角形,多边形,圆,椭圆)

    本例讲解如何通过clip path 把一个div xff08 元素 xff0c 可以是图片等 xff09 裁切成不同的形状 xff0c 这里以一个div为例宽高均为300px 注意 xff1a 不支持IE和Firefox xff0c 支持w
  • layui表格(table)排序

    layui表格本身提供sort排序 xff0c 但是只能排序当前一页 xff1b 如果后台返回几十页数据 xff0c 需要排序显示 xff0c 该如何做呢 xff0c 这里闲心大神提供了一个sort监听方法 xff1a 通过监听排序的列 x
  • Liunx下修改MySQL字符集

    Liunx下修改MySQL字符集 1 查找MySQL的cnf文件的位置 color 61 green find iname 39 cnf 39 print color color 61 olive usr share mysql my in
  • vue刷新当前页面,重载页面数据

    业务场景 xff1a 在管理后台 xff0c 在执行完 xff0c 增 xff0c 删 xff0c 改 xff0c 操作的时候 我们需要刷新一下页面 xff0c 重载数据 在JQ中我们会用到location reload 方法 xff0c
  • layui动态渲染生成左侧3级菜单(根据后台返回数据)

    声明 xff1a 这里非常感谢闲心大神 xff0c 开源了非常好用的前端UI框架 xff0c layui xff0c 如有侵权请联系我 当然闲心在2 0版本的layuiAdmin已经支持了 xff0c 不过是收费版的 xff0c 需要的同学
  • layui加载数据显示loading加载完成loading消失

    项目中 xff0c 向后台请求数据 xff0c 经常会出现较长的等待时间 xff0c 这时我们需要一个loading转圈圈 xff0c 接收到后台的数据时 xff0c 让loading消失 这layui中使用方法如下 xff1a 以表格为例
  • 信号量,消息邮箱的运用

    1 信号量的用途 1 xff09 共享资源的保护 xff0c 例如需要共用一段内存 xff0c 初始信号量的计数值为1 task1 xff1a task2 pend信号量 pend信号量 共享资源 共享资源 post信号量 post信号量
  • istio 部署及调用链显示

    选择版本号下载 https github com istio istio releases 下载 wget https github com istio istio releases download 1 13 2 istio 1 13 2
  • Poco Application 框架学习(1)

    基本的功能 提供了一个 int run int argc char argv 方法用于执行app run 方法会调用 类的 void initialize Application amp self 与 int main const std
  • Poco Application 框架学习(3)配置文件,日志

    配置文件及日志 配置文件 xff1a 配置文件初始化 一般应用程序都会有配置文件 xff0c Application 框架也不例外 通过一下接口来读取配置文件信息 当前 Poco支持的格式有 ini xml json properties
  • openssl 使用 未定义的引用

    ubuntu 下使用 openssl 3des 加密编译报错 tmp ccsIK1Cj o xff1a 在函数 main 中 xff1a test cpp text 43 0x218 xff1a 对 DES set key unchecke
  • openssl 使用 未定义的引用

    ubuntu 下使用 openssl 3des 加密编译报错 tmp ccsIK1Cj o xff1a 在函数 main 中 xff1a test cpp text 43 0x218 xff1a 对 DES set key unchecke
  • poco JSON 的使用

    三个例子 第一个是解析一个简单的 json 第二个是在构造一个 json 对象并且加入数据 第三个是解析带数组的 json对象 这三个场景基本上满足大部分需求了 span class hljs variable include span s
  • ROS(11)move_base详解

    11 move base详解 11 1 move base配置参数解读 参考链接 xff1a https blog csdn net banzhuan133 article details 90239252 https wenku baid
  • c++ 迭代器与下标访问效率问题

    今天验证下在 c 43 43 vector 下标访问及迭代器访问的效率问题 100W 数据存放到 vector 里 便利访问 xff0c 以为打印的效率很低 xff0c 所以不打印 xff0c 只是访问下就 ok 首先用迭代器的方式访问了一
  • 代码注释怎么写

    注释怎么写 注释的作用是什么 我认为注释最终作用无非就两个 1 和伪代码一样的作用 xff0c 为接下来要实现的功能写出一个指导性的算法思路 只是没有伪代码详细 但是也指出了完成此功能的大体算法思路 2 给看代码的人一个解释性说明 注意看代
  • 原始 socket 编程

    原始套接字简介 普通 socket 的权力和原始 socket 权力对比 1 原始 socket 可以和内核一样直接对所有层进行操作 除了物理层 可以更改 mac 更改 ip 更改端口 so dos 攻击就可以通过原始 socket 编程来
  • EventLoop execute() 怎么保证线程安全

    EventLoop 的 execute 是在 SingleThreadEventLoop 中实现的 64 Override public void execute Runnable task if task 61 61 null throw