转自: http://www.blogjava.net/emu/archive/2005/06/08/5775.html


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

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

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

30}

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

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

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

52}

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

<SCRIPT LANGUAGE="JavaScript"> <!-- if (Array.prototype.shift==null) Array.prototype.shift = function (){ var rs = this[0]; for (var i=1;i<this.length;i++) this[i-1]=this[i] this.length=this.length-1 return rs; } if (Array.prototype.push==null) Array.prototype.push = function (){ for (var i=0;i<arguments.length;i++) this[this.length]=arguments[i]; return this.length; } var commandList = []; var nAction = 0; var functionConstructor = function(){}.constructor; function executeCommands(){ for (var i=0;i<nAction;i++) if (commandList.length>0){ var command = commandList.shift(); if (command.constructor == functionConstructor) if (command.scheduleTime == null || new Date()-command.scheduleTime>0) command(); else commandList.push(command); } } function startNewTask(){ var resultTemp = document.getElementById("sampleResult").cloneNode(true); with (resultTemp){ id="";style.display="block";style.color=(Math.floor(Math.random()* (1<<23)).toString(16)+"00000").substring(0,6); } document.body.insertBefore(resultTemp,document.body.lastChild); commandList.push(function(){simThread(resultTemp,1);}); nAction++; } function simThread(temp,n){ if (temp.stop) n--; else temp.innerHTML = temp.innerHTML - (-n); if (n<1000) commandList.push(function(){simThread(temp,++n)}); else{ var command = function(){document.body.removeChild(temp);;nAction--;}; command.scheduleTime = new Date()-(-2000); commandList.push(command); } } setInterval("executeCommands()",1); //--> </SCRIPT> <button onclick="startNewTask()">开始新线程</button> <BR><BR> <div id=sampleResult onmouseover="this.stop=true" onmouseout="this.stop=false" style="display:none;cursor:hand">0</div> 点击这里查看效果