前言:

  虽然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. [codeforces 528]A. Glass Carving

    [codeforces 528]A. Glass Carving 试题描述 Leonid wants to become a glass carver (the person who creates ...

  2. 向着目标杀jj

     海外资深实力公司招聘:1.PHP工程师,18-25K2.UI设计师,15-25K3.前端工程师,18-25K4.Python工程师,18-25K5.DBA工程师,18-25K6.服务端工程师,18- ...

  3. JAVA程序1,1,2,3,5,8,13,21....第30个是什么...?

    解题思路:从第3个数字开始,后一个数字是前2个数字的和public class text{ public static void main(String[] args) { int num1=1,nu ...

  4. 右移>> 和 左移<<

    一个int占四个字节,也就是32位,这样的话1不论左移还是右移32位仍旧移到原来的位置,就仍旧是1了. 右移是除,左移是乘.1除1除32次和1乘1乘32次当然都还是1了. 移位操作的简单计算方法 &g ...

  5. String是引用类型

    关于String为值类型还是引用类型的讨论一直没有平息,最近一直在研究性能方面的问题,今天再次将此问题进行一次明确.希望能给大家带来点帮助. 如果有错误请指出. 来看下面例子: //值类型 ; int ...

  6. Shortest Word Distance

    Given a list of words and two words word1 and word2, return the shortest distance between these two ...

  7. html span标签 不换行(有时span带中文时候是可以自动换行的)

    <span>你好111111111111111111111111111111111111111111111111111aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ...

  8. liunx下安装MYSQL时需要安装的相关软件的作用

    2013年11月16日 14:18:39 This installs the package for MySQL server (mysql-community-server) and also pa ...

  9. codeforces A. Group of Students 解题报告

    题目链接:http://codeforces.com/problemset/problem/357/A 题目意思:将一堆人分成两组:beginners 和 intermediate coders .每 ...

  10. [Android Pro] 利用tcpdump和wireshark对android网络请求进行分析

    一: tcpdump操作流程 1. 手机要有root权限 2. 下载tcpdump   http://www.strazzere.com/android/tcpdump 3. adb push c:\ ...