javascript本身就是一个单线程的语言,一开始它的出现是为了简单的网页设计,设计者并没有考虑到多线程的问题,要知道,线程的开销是非常昂贵的。但是随着web开发的潮流化,javascript不是仅仅一门网页脚本语言那么简单了,它可以涉及到socket(websocket),canvas等复杂的操作,这时候单线程的计算远远不够,在此时html5引入了webworker(多线程)对象,用于实现js的多线程操作,虽然本身js还是门单线程的语言,实现多线程是基于Event loop的实现,这里介绍更加详细http://blog.jobbole.com/30445/

1.webworker分为Worker(专用线程) 和 SharedWorker(共享线程)两种,都必须遵守同源策略

同源策略:

为了能和服务器交互,worker必须遵守同源策略(same-origin policy)(译注:可参考国人文章同源策略)。比如,位于http://www.example.com/内的脚本文件不能访问https://www.example.com的脚本。尽管域名相同,但同源策略要求端口也必须一致。通常,这不会成为一个很大的问题。但是你很有可能会同一个域名编写worker和client,所以知道这点对你总是有所帮助。

(1)Worker(专用线程)一般用于交换信息,而不是共享信息,而SharedWorker则用于共享信息

(2)因为worker一般都是在后台运行的,所以不建议在worker中访问DOM,并进行一系列的DOM操作

2.在这里为了粗略介绍,我们只讲Worker(专用线程),有兴趣了解ShareWorker的可以在这里参考

我们将会做一个加载图片的demo,其中有三个文件:test.html,Fthread.js(父线程),Sthread.js(子线程),test.png位于web服务器网站的根目录下

test.html

<!DOCTYPE html>
<html>
<body>
</body>
<script src="Fthread.js"></script>
</html>

Fthread.js

var worker = new Worker("Sthread.js"); 创建一个子进程
worker.addEventListener("message", function(e) {
e = window.event || e; //加入一些js hack
var imgSrc = e.data; //收到子进程传递过来的数据
//创建一个图片便签并在页面显示图片
var img = document.createElement("img");
img.src = imgSrc;
document.body.appendChild(img);
/*由父进程关闭终止子进程*/
//this.terminate();
}); //很重要,不可少,这个将会触发向子进程的请求
worker.postMessage("begin");

Sthread.js

//当收到父进程传递过来的消息时,子进程响应,发回图片url
onmessage = function(e){
e = window.event || e; if (e.data === "begin") { postMessage("test.png");
} }
this.close();//关闭子进程
}

  

需要注意的是,chrome不支持本地测试,最好使用其他浏览器测试。

3.除次之外,我们还可以进行线程嵌套,即子线程再创建一个子进程,只需要在Sthread.js作些修改

//当收到父进程传递过来的消息时,子进程响应,发回图片url
onmessage = function(e){
e = window.event || e; if (e.data === "begin") { var worker = new Worker("SSThread.js");//再创建子进程
worker.onmessage = function(e1) {
e1 = window.event || e1;
postMessage(e1.data); //返回图片url到父进程
}
worker.postMessage("get url");
}
this.close();//关闭子进程
}

SSthread.js

//当收到父进程传递过来的消息时,子进程响应,发回图片url
onmessage = function(e){
e = window.event || e; if (e.data === "get url") { postMessage("test.png"); //返回图片url到父进程
} }
this.close();//关闭子进程
}

关于线程嵌套的内容暂时讲到这里了,小弟也是初学,还有很多需要尝试和学习。若有什么出错的地方,欢迎指出

html5---webworker多线程的更多相关文章

  1. 【javascript】谈谈HTML5: Web-Worker、canvas、indexedDB、拖拽事件

    前言:作为一名Web开发者,可能你并没有对这个“H5”这个字眼投入太多的关注,但实际上它早已不知不觉进入到你的开发中,并且总有一天会让你不得不正视它,了解它并运用它   打个比方:<海贼王> ...

  2. HTML5触屏版多线程渲染模板技术分享

    前言: 了解js编译原理的屌丝们都知道,js是单线程的,想当年各路神仙为了实现js的多线程,为了解决innerHTML输出大段HTML卡页面的顽疾,纷纷设计了诸如假冒的“多线程“实现,我自己也在写开源 ...

  3. 深入HTML5 Web Worker应用实践:多线程编程

    HTML5 中工作线程(Web Worker)简介 至 2008 年 W3C 制定出第一个 HTML5 草案开始,HTML5 承载了越来越多崭新的特性和功能.它不但强化了 Web 系统或网页的表现性能 ...

  4. 深入 HTML5 Web Worker 应用实践:多线程编程

    深入 HTML5 Web Worker 应用实践:多线程编程 HTML5 中工作线程(Web Worker)简介 至 2008 年 W3C 制定出第一个 HTML5 草案开始,HTML5 承载了越来越 ...

  5. 基于 HTML5 的 Web SCADA 报表

    背景 最近在一个 SCADA 项目中遇到了在 Web 页面中展示设备报表的需求.一个完整的报表,一般包含了筛选操作区.表格.Chart.展板等多种元素,而其中的数据表格是最常用的控件.在以往的工业项目 ...

  6. 关于webWorker的理解和简单例子

    一.理解 当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成. web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能.您可以继续做任何愿 ...

  7. JavaScript单线程和浏览器事件循环简述

    JavaScript单线程 在上篇博客<Promise的前世今生和妙用技巧>的开篇中,我们曾简述了JavaScript的单线程机制和浏览器的事件模型.应很多网友的回复,在这篇文章中将继续展 ...

  8. 再看JavaScript线程

    继上篇讨论了一些关于JavaScript线程的知识,我们不妨回过头再看看,是不是JavaScript就不能多线程呢?看下面一段很简单的代码(演示用,没考虑兼容问题): 代码判断一: <div i ...

  9. postMessage和sendMessage

    参考:http://www.cnblogs.com/giggle/p/5350288.html(浅谈webWorker) http://blog.csdn.net/zha_zi/article/det ...

随机推荐

  1. PHP 正则表达式匹配 preg_match 与 preg_match_all 函数

    --http://www.5idev.com/p-php_preg_match.shtml 正则表达式在 PHP 中的应用 在 PHP 应用中,正则表达式主要用于: 正则匹配:根据正则表达式匹配相应的 ...

  2. Android开发中用友盟做分享的一些坑

    仅限于用5.1.4版本的 按照友盟分享的API在自己的代码中修改: 1.微信分享需要打包APK文件,数字签名与微信开发申请的要一致 2.此name中属性不能修改 value为友盟的申请的appkey ...

  3. Kettle 实现mysql数据库不同表之间数据同步——实验过程

    下面是试验的主要步骤: 在上一篇文章中LZ已经介绍了,实验的环境和实验目的. 在本篇文章中主要介绍侧重于对Kettle ETL的相应使用方法, 在这里LZ需要说明一下,LZ成为了避免涉及索引和表连接等 ...

  4. Oracle数据导入导出imp/exp命令总结

    racle数据导入导出imp/exp就相当于oracle数据还原与备份.exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中. 利用 ...

  5. 【转】WF4.0 (基础篇)

    转自:http://www.cnblogs.com/foundation/category/215023.html 作者:WXWinter  ——  兰竹菊梅★春夏秋冬☆ —— wxwinter@16 ...

  6. opencv Iplimage结构简介

    IplImage 结构解读: typedef struct _IplImage{int nSize;                    /* IplImage大小 */int ID;        ...

  7. jQuery慢慢啃之事件(七)

    1.ready(fn)//当DOM载入就绪可以查询及操纵时绑定一个要执行的函数. $(document).ready(function(){ // 在这里写你的代码...}); 使用 $(docume ...

  8. cos-26上传个人案例

    package cn.gdpe.upload; import java.io.File;import java.io.IOException;import java.util.Enumeration; ...

  9. 使用BeanUtils组件

    使用BeanUtils组件 前提 1:导入commons-beanutils-1.8.3.jar        //根据  本人使用的是1.8.3的版本 2:导入日志包      //就是loggin ...

  10. Java学习----HashMap原理

    1.HashMap的数据结构 数组的特点是:寻址容易,插入和删除困难:而链表的特点是:寻址困难,插入和删除容易.那么我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的, ...