HTML5之Javascript多线程的详解


当前第2页 返回上一页

线程嵌套
在工作线程中还可以在创建子线程,各种操作还是一样的。

同步问题
Worker没有锁的机制,多线程的同步问题只能靠代码来解决(比如定义信号变量)。

共享型SharedWebWorker
  共享型web worker主要适用于多连接并发的问题。因为要处理多连接,所以它的API与专用型worker稍微有点区别。除了这一点,共享型web worker和专用型worker一样,不能访问DOM,并且对窗体属性的访问也受到限制。共享型web worker也不能跨越通信。
  页面脚本可以与共享型web worker通信,然而,与专用型web worker(使用了一个隐式的端口通信)稍微有点不同的是,通信是显式的通过使用一个端口(port)对象并附加上一个消息事件处理程序来进行的。

  在收到web worker脚本的首个消息之后,共享型web worker把一个事件处理程序附加到激活的端口上。一般情况下,处理程序会运行自己的postMessage()方法来把一个消息返回给调用代码,接着端口的start()方法生成一个有效的消息进程。
看网上能找到的的唯一个例子:创建一个共享线程用于接收从不同连接发送过来的指令,然后实现自己的指令处理逻辑,指令处理完成后将结果返回到各个不同的连接用户。
HTML代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<script>

  var worker = new SharedWorker('sharedworker.js');

  var log = document.getElementByIdx_x_x_x_x('response_from_worker');

  worker.port.addEventListener('message', function(e) {

  //log the response data in web page

  log.textContent =e.data;

  }, false);

  worker.port.start();

  worker.port.postMessage('ping from user web page..');

   

  //following method will send user input to sharedworker

  function postMessageToSharedWorker(input)

  {

  //define a json object to construct the request

  var instructions={instruction:input.value};

  worker.port.postMessage(instructions);

  }

  </script>

脚本文件代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

// 创建一个共享线程用于接收从不同连接发送过来的指令,指令处理完成后将结果返回到各个不同的连接用户。

 var connect_number = 0;

  

 onconnect = function(e) {

  connect_number =connect_number+ 1;

  //get the first port here

  var port = e.ports[0];

  port.postMessage('A new connection! The

current

 connection number is '

  + connect_number);

  port.onmessage = function(e) {

   //get instructions from requester

   var instruction=e.data.instruction;

   var results=execute_instruction(instruction);

    port.postMessage('Request: '+instruction+' Response '+results

      +' from shared worker...');

  };

 };

 function execute_instruction(instruction)

 {

 var result_value;

 //implement your logic here

 //execute the instruction...

 return result_value;

 }

在上面的共享线程例子中,在主页面即各个用户连接页面构造出一个共享线程对象,然后定义了一个方法 postMessageToSharedWorker 向共享线程发送来之用户的指令。同时,在共享线程的实现代码片段中定义 connect_number 用来记录连接到这个共享线程的总数。之后,用 onconnect 事件处理器接受来自不同用户的连接,解析它们传递过来的指令。最后,定义一个了方法 execute_instruction 用于执行用户的指令,指令执行完成后将结果返回给各个用户。

这里我们并没有跟前面的例子一样使用到了工作线程的 onmessage 事件处理器,而是使用了另外一种方式 addEventListener。实际上,前面已经说过,这两种的实现原理基本一致,只是在这里有些稍微的差别,如果使用到了 addEventListener 来接受来自共享线程的消息,那么就要先使用 worker.port.start() 方法来启动这个端口。之后就可以像工作线程的使用方式一样正常的接收和发送消息。

线程中能做的事
1.能使用setTimeout(), clearTimeout(), setInterval(),clearInterval()等函数。
2.能使用navigator对象。
3.能使用XMLHttpRequest来发送请求。
4.可以在线程中使用Web Storage。

5.线程中可以用self获取本线程的作用域。

线程中不能做的事
1.线程中是不能使用除navigator外的DOM/BOM对象,例如window,document(想要操作的话只能发送消息给worker创建者,通过回调函数操作)。
2.线程中不能使用主线程中的变量和函数。
3.线程中不能使用有"挂起"效果的操作命令,例如alert等。
4.线程中不能跨域加载JS。

线程也是需要消耗资源的,而且使用线程也会带来一定的复杂性,所以如果没有充足的理由来使用额外的线程的话,那么就不要用它。

以上就是HTML5之Javascript多线程的详解的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

javascript怎么判断是否为数组

javascript 开发者常用的 10 个技巧

HTML5实现动态视频背景

localstorage存储读取json怎样实现

深入了解HTML5 canvas标签的基本用法

javascript面向对象的三个基本特征介绍

如何用HTML5中的canvas绘制渐变矩形

HTML5剪切板功能的实现

javascript如何打印

浅谈javascript中的事件委托

更多相关阅读请进入《HTML5》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...