前言:

  虽然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. Stanford机器学习---第一讲. Linear Regression with one variable

    原文:http://blog.csdn.net/abcjennifer/article/details/7691571 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...

  2. 【leetcode】Palindrome Partitioning

    Palindrome Partitioning Given a string s, partition s such that every substring of the partition is ...

  3. POJ 3977

    Subset Time Limit: 30000MS   Memory Limit: 65536K Total Submissions: 1373   Accepted: 228 Descriptio ...

  4. eclipse 反编译插件安装

      1.下载jad.exe和jadclipse_3.3.0.jar 2.将jad.exe拷贝到%JAVA_HOME%bin目录下,将jadclipse_3.3.0.jar拷贝到eclipse的plug ...

  5. cjb

    输入216.194.70.6 ,进入到是cjb.net的主页,并不是shell.cjb.net ,进入主页后点击shell,就进不去了 分析:shell.cjb.net被DNS污染了 解法:hosts ...

  6. 安卓向服务器发送List数据

    第一步: 首先写一个自定义的JavaBean,以UserInfo.java为例,需要实现对象序列化的接口,因为之后输出流对象需要实现输出可序列化的对象.不这样的话,后续时发送时会报异常 package ...

  7. [转]有关USES_CONVERSION

    转自:http://blog.csdn.net/p40614021/article/details/6778100 ATL:转换宏是各种字符编码之间进行转换的一种很方便的方式,在函数调用时,它们显得非 ...

  8. Solr常用查询语法笔记

    1.常用查询 q - 查询字符串,这个是必须的.如果查询所有*:* ,根据指定字段查询(Name:张三 AND Address:北京) fq - (filter query)过虑查询,作用:在q查询符 ...

  9. 设计模式学习之原型模式(Prototype,创建型模式)(5)

    通过序列化的方式实现深拷贝 [Serializable] public class Person:ICloneable { public string Name { get; set; } publi ...

  10. Ubuntu16.04 安装openjdk-7-jdk

    Ubuntu16.04 安装openjdk-7-jdk sudo apt-get install openjdk-7-jre 或者sudo apt-get install openjdk-7-jdk ...