線程嵌套 -HTML5 Web Workers

在多個子線程中進行數據的交互

要實現子線程與子線程之間的數據交互,大致需要如下幾個步驟:

先創建發送數據的子線程。
執行子線程中的任務,然後把要傳遞的數據發送給主線程。
在主線程接受到子線程傳回來的消息時,創建接收數據的子線程,然後把
發送數據的子線程中返回的消息傳遞給接收數據的子線程。
執行接收數據子線程中的代碼。

接下來看一個在多個子線程中進行數據交互的實例,本例與上節中
實現的效果相同,同樣是隨機生成了一個整數的數組,把數組中能被5整除的
數字以表格形式輸出,並且把輸出即能被5整除也能被2整除的數字的單元格
進行描紅處理。

<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<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;
            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){
			//設置該列背景色
            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 worker;   
    //創建發送數據的子線程
    worker=new Worker("worker1.js");
    worker.postMessage("");     
    worker.onmessage = function(event) {
        //接收子線程中數據,本示例中爲創建好的隨機數組
        var data=event.data;
        //創建接收數據子線程
        worker=new Worker("worker2.js");
       //把從發送數據子線程中發回消息傳遞給接收數據的子線程
        worker.postMessage(data);
	worker.onmessage = function(event) {
             //獲取接收數據子線程中傳回數據,本示例中爲挑選結果
	    var data=event.data;
            //把挑選結果發送回主頁面
            postMessage(data);
	}
    }
}

worker1.js

onmessage = function(event) {
var intArray=new Array(100);    
for(var i=0;i<100;i  )
    intArray[i]=parseInt(Math.random()*100);
postMessage(JSON.stringify(intArray));
close();
}

worker2.js

onmessage = function(event) {
    //還原整數數組  
    var intArray= JSON.parse(event.data);
    var returnStr;
    returnStr="";
    for(var i=0;i<intArray.length;i  )
    {
        //能否被5整除
        if(parseInt(intArray[i])%5==0)    
        {
            if(returnStr!="")
                returnStr =";";
            //將能被5整除的數字拼接成字符串
            returnStr =intArray[i];    
        }
    }
    //返回拼接字符串
    postMessage(returnStr); 
    //關閉子線程          
    close();                         
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章