当前位置: 首页 > news >正文

Netty之EventLoop自定义任务

简介

EventLoop可以执行用户自定义任务

结构

EventLoop内部有任务队列存放用户自定义任务

AbstractScheduledEventExecutor
# PriorityQueue<ScheduledFutureTask>?<> scheduledTaskQueue
«abstract»
SingleThreadEventExecutor
- Queue<Runnable> taskQueue
«interface»
EventLoopTaskQueueFactory

taskQueue:自定义任务队列
EventLoopTaskQueueFactory 接口定义为

public interface EventLoopTaskQueueFactory 
{Queue<Runnable> newTaskQueue(int maxCapacity);
}

创建

NioEventLoop为例,NioEventLoopGroupnewChild中根据args的参数个数来设置任务队列创建工厂,默认是null

protected EventLoop newChild(Executor executor, Object... args) throws Exception 
{SelectorProvider selectorProvider = (SelectorProvider) args[0];SelectStrategyFactory selectStrategyFactory = (SelectStrategyFactory) args[1];RejectedExecutionHandler rejectedExecutionHandler = (RejectedExecutionHandler) args[2];EventLoopTaskQueueFactory taskQueueFactory = null;EventLoopTaskQueueFactory tailTaskQueueFactory = null;int argsLength = args.length;if (argsLength > 3) {taskQueueFactory = (EventLoopTaskQueueFactory) args[3];}if (argsLength > 4) {tailTaskQueueFactory = (EventLoopTaskQueueFactory) args[4];}return new NioEventLoop(this, executor, selectorProvider,selectStrategyFactory.newSelectStrategy(),rejectedExecutionHandler, taskQueueFactory, tailTaskQueueFactory);}

创建任务队列代码为,默认是多生产者单消费者队列

private static Queue<Runnable> newTaskQueue(EventLoopTaskQueueFactory queueFactory) 
{if (queueFactory == null) {return newTaskQueue0(DEFAULT_MAX_PENDING_TASKS);}return queueFactory.newTaskQueue(DEFAULT_MAX_PENDING_TASKS);
}private static Queue<Runnable> newTaskQueue0(int maxPendingTasks) 
{// This event loop never calls takeTask()return maxPendingTasks == Integer.MAX_VALUE ? PlatformDependent.<Runnable>newMpscQueue(): PlatformDependent.<Runnable>newMpscQueue(maxPendingTasks);
}

运行

任务队列的运行时间与ioRatio有关,其表示io运行时间比例,范围为[1,100]

  • ioRatio小于100时,如果io运行时间为t,则任务的运行时间为 t ∗ ( 100 − i o R a t i o ) i o R a t i o \frac{t * (100 - ioRatio)}{ioRatio} ioRatiot(100ioRatio)
  • ioRatio等于100时,io运行完后,会执行队列中所有的任务

执行任务是通过调用runAllTasks,先从scheduledTaskQueue队列中取出任务添加到taskQueue,每执行64个任务后,判断任务的执行时间是否超时

  • 超时就停止从任务队列中取任务,退出循环
  • 队列为空时,退出

任务执行完后,调用afterRunningAllTasks

protected boolean runAllTasks(long timeoutNanos) 
{fetchFromScheduledTaskQueue();Runnable task = pollTask();if (task == null) {afterRunningAllTasks();return false;}final long deadline = timeoutNanos > 0 ? ScheduledFutureTask.nanoTime() + timeoutNanos : 0;long runTasks = 0;long lastExecutionTime;for (;;) {safeExecute(task)runTasks ++;if ((runTasks & 0x3F) == 0) {lastExecutionTime = ScheduledFutureTask.nanoTime();if (lastExecutionTime >= deadline) {break;}}task = pollTask();if (task == null) {lastExecutionTime = ScheduledFutureTask.nanoTime();break;}}afterRunningAllTasks();this.lastExecutionTime = lastExecutionTime;return true;
}protected void afterRunningAllTasks() { }

http://www.mrgr.cn/news/75198.html

相关文章:

  • 【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
  • 低代码开发平台搭建思考与实战
  • spring-logback引用外部文件
  • Kubernetes的pod控制器
  • win10中使用ffmpeg和MediaMTX 推流rtsp视频
  • Spring 框架七大模块(Java EE 学习笔记03)
  • 自动驾驶系列—从数据采集到存储:解密自动驾驶传感器数据采集盒子的关键技术
  • Ubuntu 的 ROS 操作系统 turtlebot3 导航仿真
  • 输出1~100内的所有偶数C++
  • SpringSecurity入门
  • ubuntu连接orangepi-zero-2w桌面的几种方法
  • 深入浅出C#编程语言
  • 速盾:高防 CDN 的缓存机制是什么?
  • 优选算法 - 3 ( 位运算 模拟 分治 11000 字详解 )
  • docker .vhdx文件压缩
  • LeetCode297.二叉树的序列化和反序列化
  • 搜维尔科技:SenseGlove触觉反馈手套开箱+场景测试
  • IDL脚手架遇到的cwgo问题
  • 黑马智数Day8
  • 机器学习 ---模型评估、选择与验证(1)
  • cache中命中率和平均访问时间
  • RK3568平台开发系列讲解(platform虚拟总线驱动篇)platform总线模型
  • Shell脚本的使用
  • CPLD架构
  • KPaaS洞察|统一管理模式下跨系统用户权限修改流程详解
  • python进阶-01-利用Xpath来解析Html