前言:

  虽然html5中已经提供Worker对象进行多线程的支持,可该对象在某些场合还是无法满足需求——因为它难以操作DOM元素。

  而某些情况下,进行大量的js计算以及DOM元素调用的情况下,会出现脚本执行时间过长,被浏览器强制中断的情况。

  顾本人整合了该多线程伪类,分享给各位。

正文:

  1、设计思路

    方法模块化,一个大的需要长时间执行的进程切分成多个小进程,添加入执行队列中,由该队列进行管理,执行这些方法。

  2、源代码

/*
伪线程类
author: JeremyWang
*/
function Threading(timestamp) {
//#region 成员对象
var _t, //线程定时器
_tempTime = 0, //线程已执行时间
_timestamp = 15, //线程最多一次执行时间15ms
_waitTime = 1, //线程执行一次后休息时间1ms
_waitTimeTemp = 100, //线程未运行时休息时间100ms
_state = false, //线程状态
_methodArray = []; //线程管理
//#endregion //#region 构造函数
if (timestamp) {
setTimestamp (timestamp);
}
//#endregion //#region 成员属性
this.setTimestamp = function (value) {
_timestamp = value;
};
this.setWaitTime = function (value) {
_waitTime = value;
};
this.getMethodCount = function () {
return _methodArray.length;
};
//#endregion //#region 成员方法
this.addMethod = function (fun, arg, callback) {//添加方法到队列
var method = { fun: fun, arg: arg, callback: callback };
_methodArray.push(method);
};
this.start = function () {//开始线程
_state = true;
threadDoing();
};
this.end = function () {//结束线程
clearTimeout(_t);
_state = false;
};
var threadDoing = function () {
if (_state) {
if (_methodArray.length > 0) {
if (_tempTime < _timestamp) {
var mm = new Date().getTime();
var method = _methodArray.splice(0, 1)[0]; //移除队列
execMethod(method); //执行命令
var gap = (new Date().getTime() - mm) || 1; //至少一毫秒
_tempTime += gap;
//继续执行
threadDoing();
} else {
//休息
_tempTime = 0;
_t = setTimeout(threadDoing, _waitTime);
} } else {
//长休息
_tempTime = 0;
_t = setTimeout(threadDoing, _waitTimeTemp);
}
}
};
var execMethod = function (method) {
var result = method.fun(method.arg);
if (method.callback) {
method.callback(result);
}
};
//#endregion
}

3、使用方法

var thread = new Threading(); //伪线程

thread.start();

//测试数据
var arrObj = [];
var callback = function (result) {
console.log(result);
};
//向线程队列中添加方法
var count = 1000;
while (count--) {
thread.addMethod(function (defultItem) {
arrObj.push(defultItem);
return arrObj.length;
}, count + 1, callback);
}

伪多线程类threading.js的更多相关文章

  1. Python的多线程(threading)与多进程(multiprocessing )

    进程:程序的一次执行(程序载入内存,系统分配资源运行).每个进程有自己的内存空间,数据栈等,进程之间可以进行通讯,但是不能共享信息. 线程:所有的线程运行在同一个进程中,共享相同的运行环境.每个独立的 ...

  2. curl多线程类。

    <?php /* * Curl 多线程类 * 使用方法: * ======================== $urls = array("http://baidu.com" ...

  3. 爬虫实战:汽车之家配置页面 破解伪元素和混淆JS

    本篇介绍如何破解汽车之家配置页面的伪元素和混淆的JS. ** 温馨提示:如需转载本文,请注明内容出处.** 本文链接:https://www.cnblogs.com/grom/p/9242156.ht ...

  4. 深入解析PHP中的(伪)多线程与多进程

    本篇文章是对PHP中的(伪)多线程与多进程进行了详细的分析介绍,需要的朋友参考下 (伪)多线程:借助外力利用WEB服务器本身的多线程来处理,从WEB服务器多次调用我们需要实现多线程的程序.QUOTE: ...

  5. 让你的PHP程序真正的实现多线程(PHP多线程类)

    通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...

  6. PHP多线程类

    <?php /** * @title: PHP多线程类(Thread) * @version: 1.0 * @author: phper.org.cn < web@phper.org.cn ...

  7. 让你的PHP程序真正的实现多线程(PHP多线程类)(转)

    通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...

  8. PHP多线程的实现(PHP多线程类)

    通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...

  9. delphi 线程教学第四节:多线程类的改进

    第四节:多线程类的改进   1.需要改进的地方   a) 让线程类结束时不自动释放,以便符合 delphi 的用法.即 FreeOnTerminate:=false; b) 改造 Create 的参数 ...

随机推荐

  1. 转:PCL+VS2010环境配置

    1.下载 http://www.pointclouds.org/downloads/windows.html出下载PCL完全安装包1.6.0 all-in-one-installer,我的电脑是32位 ...

  2. Minimum Depth of Binary Tree

    二叉树的最小深度 采用递归的方式求左右结点的高度,注意判断一个结点是否是叶子结点(左右子树都不存大). int minDepth(TreeNode *root) { return minDepth(r ...

  3. HTML快速入门4

    七.表单 1. 概述 建立交互式的站点,需要使用 HTML 表单,它可以让用户提供信息,并对此作出处理.可以建立类似 复选框.单选按钮及文本框的控件. 掌握表单的使用对 Active Server P ...

  4. Powershell常用命令

    Powershell常用命令1.Get-Command 得到Powshell所有命令2.Get-Process 获取所有进程3.Set-Alias 给指定命令重命名 如:Set-Alias aaa G ...

  5. Having与Where的区别

    where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行. having 子句的作用是筛 ...

  6. hadoop(一):深度剖析hdfs原理

    在配置hbase集群将 hdfs 挂接到其它镜像盘时,有不少困惑的地方,结合以前的资料再次学习;  大数据底层技术的三大基石起源于Google在2006年之前的三篇论文GFS.Map-Reduce. ...

  7. HDU1130 卡特兰数

    How Many Trees? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. Android之自定义控件入门

    本文主要讲述了实现安卓button点击变色与利用ViewPager实现图片自动轮播效果 我伞可以看到在很多应用中,安卓按钮按下时与正常时状态是不同的,这种效果也很容易达到. 第一步:创建XML文件定义 ...

  9. Virtual Box创建共享目录

    1.先关闭ubuntu,在virtualbox“设置”中找到“共享文件夹”,点击进入,点击右边添加目录按钮,添加windows中要共享的目录,取一个名.比如我在D盘建一个名为share的文件夹,如下图 ...

  10. MyISAM InnoDB 区别

    MyISAM 和 InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处 ...