您好!欢迎访问家园网-www.jy.wang!

家园网

HTML5和Javascript的线程嵌套分析

网络 作者:本站 点击:

HTML5和Javascript的线程嵌套分析

html代码:

<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<title>使用线程单层嵌套实现从生成的随机数中挑选5的倍数</title>
    <script type="text/javascript">
var worker = new Worker("script.js");
worker.postMessage("");
worker.onmessage = function(event) {                // 从线程中取得计算结果
    if(event.data!="")
    {
        var j;                                      //行号
        var k;                                      //列号
        var tr;
        var td;
        var intArray=event.data.split(";");
        var table=document.getElementById("table");
        for(var i=0;i<intArray.length;i++)
        {            
            j=parseInt(i/10,0);
            k=i%10;
            if(k==0)  {                                    //该行不存在
                tr=document.createElement("tr");          //添加行
                tr.id="tr"+j;
                tr.style.backgroundColor="orange";
                table.appendChild(tr);
            }
            else   {                                      //该行已存在
                tr=document.getElementById("tr"+j);
            }
            td=document.createElement("td");//添加列
            tr.appendChild(td);
            td.innerHTML=intArray[j*10+k];//设置该列内容
         if((intArray[j*10+k])%2==0){//如果所选的整数技能被5整除也能被2整除
            td.style.backgroundColor="red";//设置该列背景色
          }
            td.style.color="black ";//设置该列字体颜色
            td.width="30"; //设置列宽
        }
    }
};
</script>
</head>
<body>
<h1>使用线程单层嵌套实现从生成的随机数中挑选5的倍数</h1>
<table id="table">
</table>
</body>


script.js代码:

onmessage=function(event){
    var intArray=new Array(100);    //随机数组
    //生成100个随机数
    for(var i=0;i<100;i++)
        intArray[i]=parseInt(Math.random()*100);
    var worker;
    //创建子线程
    worker=new Worker("worker.js");
    //把随机数组提交给子线程进行挑选工作
    worker.postMessage(JSON.stringify(intArray));
    worker.onmessage = function(event) {
        //把挑选结果返回主页面
        postMessage(event.data);
    }
}


worker.js代码:

onmessage = function(event) {
    var intArray= JSON.parse(event.data);   //还原整数数组
    var returnStr;
    returnStr="";
    for(var i=0;i<intArray.length;i++)
    {
        if(parseInt(intArray[i])%5==0)    //能否被5整除
        {
            if(returnStr!="")
                returnStr+=";";
            returnStr+=intArray[i];      //将能被5整除的数字拼接成字符串
        }
    }
    postMessage(returnStr);  //返回拼接字符串
    close();               //关闭子线程
}


代码解析:


这是一个使用Web Workers实现的多线程嵌套的示例。让我逐行讲解每个文件的实现:

HTML文件解析

  • <!DOCTYPE html>
    <head>
    <meta charset="UTF-8">
    <title>使用线程单层嵌套实现从生成的随机数中挑选5的倍数</title>
        <script type="text/javascript">
  • 创建主线程,在HTML中定义JavaScript代码


var worker = new Worker("script.js");
  • 创建第一个Worker线程(主线程的子线程),加载script.js文件


  • worker.postMessage("");

    向子线程发送空消息,触发子线程开始工作


  • worker.onmessage = function(event) {                // 从线程中取得计算结果

    监听子线程返回的消息事件


  •     if(event.data!="")
        {
            var j;	                                    //行号
            var k;                                      //列号
            var tr;
            var td;
            var intArray=event.data.split(";");

    将接收到的字符串数据(用;分隔)转换为数组


  •         var table=document.getElementById("table");
            for(var i=0;i<intArray.length;i++)
            {            
                j=parseInt(i/10,0);  // 计算行号,每行10个数据
                k=i%10;               // 计算列号

    计算每个数据在表格中的位置


  •             if(k==0)  {                                    //该行不存在
                    tr=document.createElement("tr");          //添加行
                    tr.id="tr"+j;
    				tr.style.backgroundColor="orange";
    				table.appendChild(tr);
                }
                else   {                                      //该行已存在
                    tr=document.getElementById("tr"+j);
                }

    如果是新行的第一列(k==0),创建新的表格行;否则获取已存在的行


  •             td=document.createElement("td");//添加列
                tr.appendChild(td);
                td.innerHTML=intArray[j*10+k];//设置该列内容

    创建单元格并设置内容


         if((intArray[j*10+k])%2==0){//如果所选的整数也能被2整除
            td.style.backgroundColor="red";//设置该列背景色
		  }
            td.style.color="black ";//设置该列字体颜色
            td.width="30"; //设置列宽
        }
    }
};


script.js(中间层Worker)解析

  • onmessage=function(event){
  • 监听主线程发送的消息


    var intArray=new Array(100);    //随机数组
    //生成100个随机数
    for(var i=0;i<100;i++)
        intArray[i]=parseInt(Math.random()*100);
  • 生成100个0-99之间的随机整数


  •     var worker;
        //创建子线程
        worker=new Worker("worker.js");
        //把随机数组提交给子线程进行挑选工作
        worker.postMessage(JSON.stringify(intArray));
  • 创建嵌套的Worker线程,将随机数组转换为JSON字符串后发送


  •     worker.onmessage = function(event) {
            //把挑选结果返回主页面
            postMessage(event.data);
        }
    }
  • 监听子线程的返回结果,并转发给主线程


worker.js(最内层Worker)解析

  • onmessage = function(event) {
        var intArray= JSON.parse(event.data);   //还原整数数
  • 接收JSON字符串并解析回JavaScript数组


  •     var returnStr;
        returnStr="";
        for(var i=0;i<intArray.length;i++)
        {
            if(parseInt(intArray[i])%5==0)    //能否被5整除
            {
                if(returnStr!="")
                    returnStr+=";";
                returnStr+=intArray[i];      //将能被5整除的数字拼接成字符串
            }
        }
  • 遍历数组,筛选出能被5整除的数,用分号拼接成字符串



  •     postMessage(returnStr);  //返回拼接字符串
        close();               //关闭子线程

    将结果返回给父线程(script.js),然后关闭自身

整体流程

  1. 主线程创建worker1(script.js)

  2. worker1生成100个随机数

  3. worker1创建worker2(worker.js)并传递随机数

  4. worker2筛选5的倍数,返回结果给worker1

  5. worker1将结果转发给主线程

  6. 主线程在表格中显示结果,并将能被2整除的数标红

这是一个典型的Web Workers多线程嵌套应用,实现了数据的多级处理。

标签: