伪多线程类threading.js
前言:
虽然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的更多相关文章
- Python的多线程(threading)与多进程(multiprocessing )
进程:程序的一次执行(程序载入内存,系统分配资源运行).每个进程有自己的内存空间,数据栈等,进程之间可以进行通讯,但是不能共享信息. 线程:所有的线程运行在同一个进程中,共享相同的运行环境.每个独立的 ...
- curl多线程类。
<?php /* * Curl 多线程类 * 使用方法: * ======================== $urls = array("http://baidu.com" ...
- 爬虫实战:汽车之家配置页面 破解伪元素和混淆JS
本篇介绍如何破解汽车之家配置页面的伪元素和混淆的JS. ** 温馨提示:如需转载本文,请注明内容出处.** 本文链接:https://www.cnblogs.com/grom/p/9242156.ht ...
- 深入解析PHP中的(伪)多线程与多进程
本篇文章是对PHP中的(伪)多线程与多进程进行了详细的分析介绍,需要的朋友参考下 (伪)多线程:借助外力利用WEB服务器本身的多线程来处理,从WEB服务器多次调用我们需要实现多线程的程序.QUOTE: ...
- 让你的PHP程序真正的实现多线程(PHP多线程类)
通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...
- PHP多线程类
<?php /** * @title: PHP多线程类(Thread) * @version: 1.0 * @author: phper.org.cn < web@phper.org.cn ...
- 让你的PHP程序真正的实现多线程(PHP多线程类)(转)
通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...
- PHP多线程的实现(PHP多线程类)
通过WEB服务器来实现PHP多线程功能. 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程. 但不管怎么样,它还是能满足我们的一些需要的 ...
- delphi 线程教学第四节:多线程类的改进
第四节:多线程类的改进 1.需要改进的地方 a) 让线程类结束时不自动释放,以便符合 delphi 的用法.即 FreeOnTerminate:=false; b) 改造 Create 的参数 ...
随机推荐
- 从零开始写一个武侠冒险游戏-7-用GPU提升性能(2)
从零开始写一个武侠冒险游戏-7-用GPU提升性能(2) ----把地图处理放在GPU上 作者:FreeBlues 修订记录 2016.06.21 初稿完成. 2016.08.06 增加对 XCode ...
- C++中的vector使用范例
原文链接 http://blog.csdn.net/tjh666/article/details/1604119 1.vector 的数据的存入和输出: #include<stdio.h> ...
- Python fopen,open,和popen的区别
1. fopen 打开普通文件 带缓冲区撒点粉撒点粉阿桑地方 缓冲文件系统是借助文件结构体指针来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符.字符串.格式化数据,也可以读写二 ...
- systemd在各个linux发行版的普及
后面我要说下自己的意见: 原则如果阻碍了进步,那还算个屁,不客气地说,UNIX 原则已经过时了. 移植性问题:我除了 Mac 外不用任何 BSD 系统,当然 Mac 上一般只做开发不做运维(但就算如此 ...
- 【Django】Django 文件下载最佳实践
代码: from django.http import StreamingHttpResponse def big_file_download(request): # do something... ...
- 【原创】Js:日期处理(日期格式必须【yyyy-mm-dd】才能转成long的毫秒!其他的不是【年-月-日】的格式,结果会是【NaN】)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Solr5.3.1通过copyField设置多个field(字段)同时检索
如果业务需要我们对多个field同时进行检索,有没有什么好的办法呢?非常幸运的是Solr为我们提供了copyField对多个field进行索引和检索.然而配置也非常简单. 修改schame.xml,添 ...
- Java for LeetCode 198 House Robber
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- codeforces 476C.Dreamoon and Sums 解题报告
题目链接:http://codeforces.com/problemset/problem/476/C 题目意思:给出两个数:a 和 b,要求算出 (x/b) / (x%b) == k,其中 k 的取 ...
- poj 3750 小孩报数问题 解题报告
题目链接:http://poj.org/problem?id=3750 约瑟夫问题,直接模拟即可. #include <iostream> #include <string> ...