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(模拟多线程)相关推荐

  1. extjs源码分析-(Ext.urlDecode/urlEncode)

    //把json格式转化成url的编码方式 // e.g. Ext.urlEncode({foo: 1, bar: 2}); would return "foo=1&bar=2&quo ...

  2. Vue1.0.25源码分析,及Zue模拟实现(一)

    前言 之前断断续续地在研究vue原理,但还未动手实战过.本文从最简单的开始,vue如何将{{}}与data联系起来,并渲染出来,比如{{msg}},data(){ return {msg:333} } ...

  3. Spring源码分析(三)

    Spring源码分析 第三章 手写Ioc和Aop 文章目录 Spring源码分析 前言 一.模拟业务场景 (一) 功能介绍 (二) 关键功能代码 (三) 问题分析 二.使用ioc和aop重构 (一) ...

  4. Equals和EqualsIgnoreCase源码分析

    Equals和EqualsIgnoreCase源码分析 先看下模拟案例 package csdn.hsy.cool.blog;/*** 源码分析练习:简单篇之字符串比较Equals和EqualsIgn ...

  5. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(一)

    课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...

  6. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(二)

    课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...

  7. java.util.ServiceLoader源码分析

    java.util.ServiceLoader源码分析 回顾: ServiceLoader类的使用(具体参考博客http://blog.csdn.net/liangyihuai/article/det ...

  8. koa2 一网打尽(基本使用,洋葱圈,中间件机制和模拟,源码分析,核心点,生态)

    原文https://juejin.im/entry/5bfbe5a76fb9a049cb186cfa/detail koa homepage 优秀的下一代 web 开发框架. Koa 应用程序不是 H ...

  9. Java Review - 线程池中使用ThreadLocal不当导致的内存泄漏案例源码分析

    文章目录 概述 Why 内存泄露 ? 在线程池中使用ThreadLocal导致的内存泄漏 概述 ThreadLocal的基本使用我们就不赘述了,可以参考 每日一博 - ThreadLocal VS I ...

最新文章

  1. 学习使用Bing Maps Silverlight Control(五):离线使用和自定义地图模式
  2. Udacity机器人软件工程师课程笔记(三十二) - 卡尔曼滤波器 - 一维卡尔曼滤波器 - 多维卡尔曼滤波器 - 拓展卡尔曼滤波器(EKF)
  3. 《编写高质量代码:改善c程序代码的125个建议》——建议4-1:整数转换为新类型时必须做范围检查...
  4. 机器学习算法与Python实践之(二)支持向量机
  5. 可能是最简单易懂的人工智能入门书
  6. How to hide index.php on nginx
  7. 如何构建健全的信用评估体系
  8. 华为机试HJ30:字符串合并处理
  9. 风云2号卫星云图_今天从零教你开始利用Python打造词云图!
  10. OFDM插入导频过程详解
  11. AspNetPager的使用
  12. 各种提权、渗透经验技巧总结大全(下)
  13. 把一个字符串13579先变成Array——[1, 3, 5, 7, 9],再利用reduce(),就可以写出一个把字符串转换为Number的函数。
  14. 双目立体视觉 II:块匹配视差图计算
  15. Cocos2D-X Tutorial for iOS and Android: Getting Started
  16. 怎么用计算机解开手机,怎么用手机解锁电脑?用手机指纹解锁电脑图文教程
  17. 如何在微信 [[公众号]]添加小程序卡片
  18. PSINS惯性器件误差模拟与分析
  19. Amy博客园 开通了
  20. vue中使用video-player无法播放视频

热门文章

  1. mysql newid函数_sql随机函数newID()和RAND()详解
  2. 暂无支持此机型的手机版本_miui+app官方版-miui+安卓版 _5577安卓网
  3. linux开发板调试,用arm-gdb和gdbserver调试开发板的方法
  4. 20210408:力扣(二分查找法的两种写法以及变体题目)
  5. 20191007:选择排序,插入排序,冒泡排序详解
  6. 卡内基梅隆计算机专业,详解卡内基梅隆大学计算机学院
  7. 海洋zyapi.php,zyapi.php · 姬晓亮/海洋cms 海洋影视管理系统 - 免费开源PHP - Gitee.com...
  8. oracle将日期格式化to_char及字符串转日期to_date
  9. 纯VB代码取得硬盘的物理序列号
  10. VB计算文本文件的行数