extjs源码分析-Ext.util.TaskRunner(模拟多线程)
2019独角兽企业重金招聘Python工程师标准>>>
/**
* @class Ext.util.TaskRunner
* @description 模拟多线程的JS类
//一个简单的更新闹钟时间的任务
var updateClock = function(){ Ext.fly('clock').update(new Date().format('g:i:s A'));
}
var task = { run: updateClock, interval: 1000 //1 秒
}
var runner = new Ext.util.TaskRunner();//实例化一个线程管理器
runner.start(task);//开始执行task线程
//下面是简易的写法
Ext.TaskMgr.start({ run: updateClock, interval: 1000
});
* 对比查看{@link Ext.util.DelayedTask}.
* @constructor
* @param {Number} interval 这个设置线程管理器的执行时间,默认为10毫秒
* (defaults to 10)
*/
Ext.util.TaskRunner = function(interval){ interval = interval || 10; var tasks = [], //任务集合 removeQueue = [],//被移除的任务 id = 0,//定时器ID running = false,//是否正在执行 // private stopThread = function(){//停止执行,并把running 和 id 重置 running = false; clearInterval(id); id = 0; }, // private startThread = function(){//开始执行,确定当前进程还没执行 if(!running){ running = true; id = setInterval(runTasks, interval); } }, // private removeTask = function(t){//删除进程, removeQueue.push(t);//把不要再执行的进程放到removeQueue数组中,以等待下次执行其他进程的时候把删除掉 if(t.onStop){//进程停止后的回调函数 t.onStop.apply(t.scope || t); } }, // private runTasks = function(){ var rqLen = removeQueue.length,//获取被 now = new Date().getTime(); if(rqLen > 0){ for(var i = 0; i < rqLen; i++){ tasks.remove(removeQueue[i]);//把removeQueue中的值从tasks中移除 } removeQueue = [];//重新重置 removeQueue if(tasks.length < 1){//如果进程数为0,那直接返回,并停止当前正在执行的进程 stopThread(); return; } } for(var i = 0, t, itime, rt, len = tasks.length; i < len; ++i){ t = tasks[i]; itime = now - t.taskRunTime;//当前时间 - 线程的最后一次运行的时间 //因为这个函数默认的interval为10,也就是整个线程实例是每隔10毫秒会去监控一次是否有需要运行的任务, //这样做的原因是保障每个任务的定时器可以不一样,但都能执行得到,这就是这个函数能支持多个定时任务的原因所在,其实也就是模拟了多线程 if(t.interval <= itime){ rt = t.run.apply(t.scope || t, t.args || [++t.taskRunCount]); t.taskRunTime = now;//重新更新当前线程的执行时间 //如果线程结束,则删除当前线程 if(rt === false || t.taskRunCount === t.repeat){ removeTask(t); return; } } //如果存在 duration 并且已经超出了执行时间了,比如我要求这个线程执行时间 即duration 为一分钟, //那么我这个任务已经执行时间(当前时间 - 线程开始执行的时间)必须小于 一分钟,否则的话那这个线程就得删除 if(t.duration && t.duration <= (now - t.taskStartTime)){ removeTask(t); } } }; /** * Starts a new task. * @method start * @param {Object} task 配置属性:<ul> * <li>run : Function 每次执行的回调函数,参数为 下面的 args 或者 当前线程被执行的次数 </li> * <li>args : Array 这个值穿给上面的function</li> * <li>scope : Object 线程执行的作用域 默认为当前的线程 </li> * <li>duration : Number (optional) 执行的时长,单位是毫秒</li> * <li>repeat : Number(optional) 线程执行的次数</li> * </ul> * @return {Object} The task */ this.start = function(task){ tasks.push(task); task.taskStartTime = new Date().getTime();//线程开始执行的时间 task.taskRunTime = 0;//线程执行的的时间 这个是以毫秒为单位的数字 1000便是一秒 task.taskRunCount = 0;//线程执行的次数 startThread(); return task; }; /** * @description 停止某个线程执行 * @method stop * @param {Object} task 被停止的线程 * @return {Object} 返回被停止的线程 */ this.stop = function(task){ removeTask(task); return task; }; /** * @description 停止所有线程. * @method stopAll */ this.stopAll = function(){ stopThread(); for(var i = 0, len = tasks.length; i < len; i++){ if(tasks[i].onStop){ tasks[i].onStop(); } } tasks = []; removeQueue = []; };
};
//多线程实例化对象
Ext.TaskMgr = new Ext.util.TaskRunner();
转载于:https://my.oschina.net/darkness/blog/357031
extjs源码分析-Ext.util.TaskRunner(模拟多线程)相关推荐
- extjs源码分析-(Ext.urlDecode/urlEncode)
//把json格式转化成url的编码方式 // e.g. Ext.urlEncode({foo: 1, bar: 2}); would return "foo=1&bar=2&quo ...
- Vue1.0.25源码分析,及Zue模拟实现(一)
前言 之前断断续续地在研究vue原理,但还未动手实战过.本文从最简单的开始,vue如何将{{}}与data联系起来,并渲染出来,比如{{msg}},data(){ return {msg:333} } ...
- Spring源码分析(三)
Spring源码分析 第三章 手写Ioc和Aop 文章目录 Spring源码分析 前言 一.模拟业务场景 (一) 功能介绍 (二) 关键功能代码 (三) 问题分析 二.使用ioc和aop重构 (一) ...
- Equals和EqualsIgnoreCase源码分析
Equals和EqualsIgnoreCase源码分析 先看下模拟案例 package csdn.hsy.cool.blog;/*** 源码分析练习:简单篇之字符串比较Equals和EqualsIgn ...
- idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(一)
课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...
- idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(二)
课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...
- java.util.ServiceLoader源码分析
java.util.ServiceLoader源码分析 回顾: ServiceLoader类的使用(具体参考博客http://blog.csdn.net/liangyihuai/article/det ...
- koa2 一网打尽(基本使用,洋葱圈,中间件机制和模拟,源码分析,核心点,生态)
原文https://juejin.im/entry/5bfbe5a76fb9a049cb186cfa/detail koa homepage 优秀的下一代 web 开发框架. Koa 应用程序不是 H ...
- Java Review - 线程池中使用ThreadLocal不当导致的内存泄漏案例源码分析
文章目录 概述 Why 内存泄露 ? 在线程池中使用ThreadLocal导致的内存泄漏 概述 ThreadLocal的基本使用我们就不赘述了,可以参考 每日一博 - ThreadLocal VS I ...
最新文章
- 学习使用Bing Maps Silverlight Control(五):离线使用和自定义地图模式
- Udacity机器人软件工程师课程笔记(三十二) - 卡尔曼滤波器 - 一维卡尔曼滤波器 - 多维卡尔曼滤波器 - 拓展卡尔曼滤波器(EKF)
- 《编写高质量代码:改善c程序代码的125个建议》——建议4-1:整数转换为新类型时必须做范围检查...
- 机器学习算法与Python实践之(二)支持向量机
- 可能是最简单易懂的人工智能入门书
- How to hide index.php on nginx
- 如何构建健全的信用评估体系
- 华为机试HJ30:字符串合并处理
- 风云2号卫星云图_今天从零教你开始利用Python打造词云图!
- OFDM插入导频过程详解
- AspNetPager的使用
- 各种提权、渗透经验技巧总结大全(下)
- 把一个字符串13579先变成Array——[1, 3, 5, 7, 9],再利用reduce(),就可以写出一个把字符串转换为Number的函数。
- 双目立体视觉 II:块匹配视差图计算
- Cocos2D-X Tutorial for iOS and Android: Getting Started
- 怎么用计算机解开手机,怎么用手机解锁电脑?用手机指纹解锁电脑图文教程
- 如何在微信 [[公众号]]添加小程序卡片
- PSINS惯性器件误差模拟与分析
- Amy博客园 开通了
- vue中使用video-player无法播放视频
热门文章
- mysql newid函数_sql随机函数newID()和RAND()详解
- 暂无支持此机型的手机版本_miui+app官方版-miui+安卓版 _5577安卓网
- linux开发板调试,用arm-gdb和gdbserver调试开发板的方法
- 20210408:力扣(二分查找法的两种写法以及变体题目)
- 20191007:选择排序,插入排序,冒泡排序详解
- 卡内基梅隆计算机专业,详解卡内基梅隆大学计算机学院
- 海洋zyapi.php,zyapi.php · 姬晓亮/海洋cms 海洋影视管理系统 - 免费开源PHP - Gitee.com...
- oracle将日期格式化to_char及字符串转日期to_date
- 纯VB代码取得硬盘的物理序列号
- VB计算文本文件的行数