`
ihuashao
  • 浏览: 4744989 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

在javascript中用command模式模拟多线程

阅读更多

作者:emu(黄希彤)今天和徐鹏程msn的时候聊起javascript不支持多线程。以前也看过有高手在wsh上可以创建thread对象,但是毕竟不是常规手段,我们做web应用一般没有本地访问权限的,用activex的没试过,毕竟也不是javascript方式。

以前我们解决这样的问题都是针对具体问题写一段代码来模拟多线程的,但是由于往往要对没个线程单独编码,这样的代码十分冗长。学习设计模式的时候就曾经考虑过在javascript中实用command模式来更好的模拟多线程,但是一直没有付诸实施,今天既然想起来了就试试看:

1<html><head><title>emu--用command模式模拟多线程</title></head><body>
2<SCRIPTLANGUAGE="JavaScript">
3<!--
4if(Array.prototype.shift==null)
5Array.prototype.shift=function(){
6varrs=this[0];
7for(vari=1;i<this.length;i++)this[i-1]=this[i]
8this.length=this.length-1
9returnrs;
10}

11if(Array.prototype.push==null)
12Array.prototype.push=function(){
13for(vari=0;i<arguments.length;i++)this[this.length]=arguments[i];
14returnthis.length;
15}

16
17varcommandList=[];
18varnAction=0;//控制每次运行多少个动作
19varfunctionConstructor=function(){}.constructor;
20functionexecuteCommands(){
21for(vari=0;i<nAction;i++)
22if(commandList.length>0){
23varcommand=commandList.shift();
24if(command.constructor==functionConstructor)
25if(command.scheduleTime==null||newDate()-command.scheduleTime>0)
26command();
27else
28commandList.push(command);
29}

30}

31
32functionstartNewTask(){
33varresultTemp=document.getElementById("sampleResult").cloneNode(true);
34with(resultTemp){
35id="";style.display="block";style.color=(Math.floor(Math.random()*(1<<23)).toString(16)+"00000").substring(0,6);
36}

37document.body.insertBefore(resultTemp,document.body.lastChild);
38commandList.push(function(){simThread(resultTemp,1);});
39nAction++;
40}

41
42functionsimThread(temp,n){
43if(temp.stop)n--;
44elsetemp.innerHTML=temp.innerHTML-(-n);
45if(n<1000)
46commandList.push(function(){simThread(temp,++n)});
47else{
48varcommand=function(){document.body.removeChild(temp);;nAction--;};
49command.scheduleTime=newDate()-(-2000);
50commandList.push(command);
51}

52}

53
54window.onload=function(){setInterval("executeCommands()",1);}
55//-->
56
</SCRIPT>
57<buttononclick="startNewTask()">开始新线程</button>
58
59<BR><BR>
60<divid=sampleResultonmouseover="this.stop=true"onmouseout="this.stop=false"style="display:none;cursor:hand">0</div>
61</body>
62</html>

注意第26行。javascript里面函数也是对象,所以就没有必要把函数调用包装到do或者execute方法里面了,直接用()就可以让函数对象运行起来:
command();

shift和push函数是javascript中array对象的函数,可是IE5居然没有定义,最前面两个函数是为IE5准备的。

在IE和FireFox下面通过作者:emu(黄希彤)

点击这里看效果
分享到:
评论

相关推荐

    JavaScript的单线程与多线程:深入理解与应用实践

    本文将深入探讨JavaScript的单线程和多线程概念,解释它们如何影响程序的执行,以及如何在实际开发中利用这些特性。 JavaScript的单线程和多线程模型各有优势和挑战。开发者需要根据应用的具体需求,合理选择并发...

    JavaScript设计模式与开发实践.pdf

    singleton模式、Factory模式、Abstract Factory模式、Builder模式、Prototype模式、Adapter模式、Bridge模式、Composite模式、Decorator模式、Flyweight模式、Proxy模式、Chain of Responsibility模式、Command模式...

    一个JavaScript多线程函数库

    为了解决这个问题,JavaScript社区引入了一些机制来模拟多线程,例如Web Workers。 "一个JavaScript多线程函数库"的目标就是提供这样的解决方案,允许开发者并行执行多个JS函数,提高应用性能。这个库可能利用Web ...

    JavaScript使用yield模拟多线程的方法

    本文实例讲述了JavaScript使用yield模拟多线程的方法。分享给大家供大家参考。具体分析如下: 在python和C#中都有yield方法,通过yield可以实现很多多线程才能实现的功能。 对javascript有版本要求:JavaScript 1.7...

    JavaScript设计模式.pdf

    JavaScript设计模式是指在软件开发中使用JavaScript语言编写的设计模式。这些设计模式旨在提高代码的重用性、可读性、维护性和扩展性。以下是JavaScript设计模式的知识点总结: 1. 单体模式(Singleton Pattern)...

    强大安全多线程的Flux模式

    在多线程环境下,Flux模式的实现需要考虑到并发和同步问题。JavaScript在浏览器环境中的执行是单线程的,但我们可以利用Web Workers或者Service Workers在后台处理数据,确保主线程不受阻塞。这可以通过将耗时的操作...

    idhttp多线程模拟登录实例

    在模拟登录场景中,多线程可以同时处理多个用户的登录请求,避免单一线程导致的阻塞,从而提升了用户体验。在Delphi中,我们可以使用TThread类来创建和管理线程,确保每个登录操作都在独立的线程上运行。 接下来,...

    Concurrent.Thread.js多线程执行大批量函数

    介绍了一个可以在JavaScript中应用多线程的库:Concurrent.Thread,内有多线程库脚本,以及使用说明和实例,如果查看详情,可以查看我的博客https://blog.csdn.net/hsl_1990_08_15/article/details/84765772

    学用JavaScript设计模式

    例如,在JavaScript中,我们经常会利用函数作用域和闭包来模拟私有方法和私有属性,以及使用原型链来模拟类继承。 最后,本书提供了非常实用的参考资料,包括了一些作者认可的技术专家和其推荐的博客和微博,读者...

    JS模拟多线程

    3. **模拟多线程**:由于 JavaScript 的单线程特性,我们无法真正实现多线程,但可以通过一些技巧来模拟多线程的效果,比如利用回调函数、`setTimeout` 或者 `setInterval` 来控制任务的执行顺序和并发度。...

    javascript多线程

    **Atomics** 对象提供了原子操作,用于在多个线程之间安全地操作SharedArrayBuffer。这两个特性结合使用,开发者可以在Web Workers之间实现数据共享和同步,从而实现多线程计算。 ### 4. Workers and Channels 在...

    JavaScript应用实例-多线程.js

    JavaScript应用实例-多线程.js

    JavaScript高级与设计模式.zip

    在这个"JavaScript高级与设计模式"的主题中,我们将深入探讨JavaScript的高级特性以及如何在实践中应用设计模式。 首先,让我们关注JavaScript的高级特性。这些特性包括但不限于: 1. **闭包(Closures)**:闭包...

    JavaScript应用实例-多线程测试.js

    JavaScript应用实例-多线程测试.js

    FireBreath_多线程及调用JS例子

    "FireBreath_多线程及调用JS例子"这个压缩包显然包含了关于如何在FireBreath插件中实现多线程以及与JavaScript交互的示例代码。 多线程在软件开发中是非常重要的一个概念,特别是在处理耗时任务或者需要并行处理...

    ASP.Net 多线程-IIS搭建-线程池-video

    在多线程环境中,委托常被用作启动新线程的手段。通过创建Thread对象并使用Start方法,或使用ThreadPool类,开发者可以利用委托来启动异步操作,提高程序并行处理能力。 2. **线程池**:线程池是一组预先创建并管理...

Global site tag (gtag.js) - Google Analytics