9月3号=》451页-455页
17.1 使用Worker创建多线程
在介绍JavaScript多线程之前,先回顾以前的JavaScript编程:在前面介绍的所有JavaScript代码中,所有的JavaScript脚本都在主线程中执行。
如果当前脚本包含复杂的、耗时的代码,那么JavaScript脚本的执行将会被阻塞,甚至整个浏览器都会提示失去响应。
下面假设程序要计算、收集1~99999之间的所有质数(在大于1的自然数中,除了1和该整数自身外,没法被其他自然后整除的数),如果程序
不采用后台线程,而是直接使用JavaScript前台线程计算收集质数,代码如下:
<p>已经发现的所有质数:<div id="result"></div></p>
<script type="text/javascript">
var n = 1;
search:
while(n<99999)
{
//开始搜寻下一个质数
n+=1;
for(var i =2; i<=Math.sqrt(n); i++)
{
//如果除以n的余数为0,则开始判断下一个数字
if(n%i==0)
{
continue search;
}
}
document.getElementById("result").innerHTML+=(n+",");
}
</script>
使用浏览器打开页面,页面将会暂时一片空白。如果需要继续增大收集的范围,那就有可能直接导致浏览器停止响应了。
如果改为使用Web Worker启动多线程来执行这个任务,那么页面效果就完全不同了。
使用Worker创建多线程非常简单,只要调用Worker的构造器即可。Worker提供了如下构造器。
Worker(scriptURL):scriptURL用于指定使用JavaScript脚本的路径。
下面改为使用Worker启动多线程来计算、收集这些质数,代码如下:
<p>已经发现的所有质数:<div id="result"></div></p>
<script type="text/javascript">
var worker = new Worker('worker.js');
worker.onmessage = function(event)
{
document.getElementById('result').innerHTML+=event.data+",";
}
</script>
//worker.js脚本代码
var n = 1;
search:
while(n<99999)
{
//开始搜寻下一个质数
n+=1;
for(var i =2; i<=Math.sqrt(n); i++)
{
//如果除以n的余数为0,则开始判断下一个数字
if(n%i==0)
{
continue search;
}
}
//发现质数
postMessage(n);
}
Worker启动的子线程找到质数之后,并不能直接把找到的质数更新在页面上显示,而是必须通过postMessage(n);发送消息来与前台JavaScript通信。
在浏览器中浏览该页面,可以看到页面上收集到的质数在不断增加,页面内容不会被阻塞。
浙公网安备 33010602011771号