前言:

  虽然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. aspx注入靶机源码

    ASPX:   <%@ Page language="c#" validateRequest=false %> <!DOCTYPE HTML PUBLIC &qu ...

  2. linux tar文件解压

    把常用的tar解压命令总结下,当作备忘: tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个, ...

  3. MyEclipse安装JS代码提示(Spket插件)

    近期需要大量使用JS来开发,但是MyEclipse2014自带的JS编辑器没有代码提示的功能,开发效率有点低,所以安装了一个Spket的插件,过程非常简单,SVN插件的安装比这个更简单. Spket插 ...

  4. macbook air 安装win7双系统

    转自: http://jingyan.baidu.com/article/6d704a13f99f1a28da51ca49.html 1)遇到“No bootable device-insert bo ...

  5. 【JavaScript】SVG vs Canvas vs WebGL

    参考资料: http://blog.csdn.net/lufy_legend/article/details/38292125 http://zhidao.baidu.com/link?url=e4n ...

  6. 【Hibernate】Hibernate系列6之HQL查询

    HQL查询 6.1.概述 6.2.分页查询 6.3.命名查询 6.4.投影查询-部分字段查询 6.5.报表查询 6.6.迫切左外连接.左外连接 6.7.迫切内连接.内连接 6.8.QBC查询.本地查询

  7. 《转载》三年建站之路走得一事无成 今来A5撞墙反思

    本文转载自A5站的蚕丝被.如果给站长带来不便之处,请联系博主. 时间过得真快,记得上一次在A5写文章已经是一年前的事了,这其中是有原因的,今天就跟大家来聊聊三年来个人失败经历的撞墙反思,也给一些有着同 ...

  8. 【转】Solr5.3.1定时增量添加索引和重做索引

    本文转自:https://code.google.com/p/solr-dataimport-scheduler/ Solr Data Import Hander Scheduler 说明:Solr官 ...

  9. kettle作业中的js如何写日志文件

    在kettle作业中JavaScript脚本有时候也扮演非常重要的角色,此时我们希望有一些日志记录.下面是job中JavaScript记录日志的方式. job的js写日志的方法. 得到日志输出实例 o ...

  10. JAVA读取XML文件数据

    XML文档内容如下: <?xml version="1.0" encoding="UTF-8"?> <root> <field t ...