博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HTML5-Web Workers实现多线程
阅读量:3661 次
发布时间:2019-05-21

本文共 1092 字,大约阅读时间需要 3 分钟。

HTML5-Web Workers实现多线程

当在 HTML 页面中执行脚本时,页面的状态是不可响应的,直到脚本已完成。虽然在JavaScript中有setInterval和setTimeout函数使javaScript看起来好像使多线程执行,单实际上JavaScript使单线程的,一次只能做一件事情。

可以运行以下示例,检验js的单线程特性。

相关代码请到查看。

如果JavaScript是多线程,在弹出警告框两秒后,页面应该出现一个li标签(内容为world)。事实上因为JavaScript是单线程,所以如果你不点击弹出框的确定按钮,world这个li永远也出不来。

这里写图片描述
点击确定后
这里写图片描述

web worker 是运行在后台的 JavaScript,独立于其他脚本,不会影响页面的性能。您可以继续做任何愿意做的事情:点击、选取内容等等,而此时 web worker 在后台运行。

我们需要把希望单独执行的javascript代码放到一个单独的js文件中,然后在页面中调用Worker构造函数来创建一个线程,参数是该文件路径,参数存放如果是相对地址,那么要以包含调用Worker构造函数语句所在脚本为参照,如果是绝对路径,需要保证同源(协议+主机+端口)。这个文件不需要我们在页面使用script标签显示引用。

var worker = new Worker('src/js/worker.js');

我们可以看到worker对象只有两个属性,其实是两个回调函数句柄

  1. onerror:当worker运行出现错误,并且没有在worker中ing捕获,会在此捕获
  2. onmessage:当worker向主线程发送消息是调用

在其prototype内有两个重要方法

  1. postMessage:很熟悉的赶脚,之前我们介绍过window对象的postMessage()方法,woker的postMessage方法和window的比较类似,但参数略有不同,只需要传递消息内容就可以,而且支持所有JavaScript原生数据类型,当然不放心的话同样也可以序列化为字符串传递
  2. terminate:终止worker执行,有些worker执行比较慢,主线程可以主动终止其执行

下面我们用web workers重写上面那个例子。

相关代码请到查看。

test_web_worker.html

worker.js

setTimeout(function(){
console.log('done!');},2000);

这里写图片描述

注意到,弹出警告框两秒后控制台打印出了 done! ,好像实现了多线程一样。

你可能感兴趣的文章
getValueFromEvent和shouldUpdate
查看>>
2019/07/18 kvm虚拟化(04)
查看>>
2019/07/24 git server(05)
查看>>
2019/07/24 搜索引擎及ES概述(01)
查看>>
2019/07/29 Linux容器和lxc(01)
查看>>
2019/07/31 docker容器和镜像(03)容器部分
查看>>
Dubbo与spi扩展
查看>>
微服务面试笔记
查看>>
SpringCloud-基础设施即服务day3-Docker上
查看>>
SpringCloud-基础设施即服务day4-Docker中
查看>>
SpringCloud-基础设施即服务day5-DockerCompose
查看>>
SpringCloud-平台即服务day6-GitLab
查看>>
SpringCloud-平台即服务day7-Nexus和Registry
查看>>
Spring Security oAuth2
查看>>
2021网易游戏雷火2021春招游戏功能测试工程师 笔试记录----春招补录
查看>>
完全理解Docker安装软件,只需三步!
查看>>
整体学习Spring的Bean生命周期(上帝视角)
查看>>
Redis分布式锁逐步完善过程,最后推荐Redisson框架
查看>>
区块链11-区块链去中心化应用开发4-DAPP实战-应用介绍及前置知识
查看>>
Vue2.x中使用Bus遇到的问题及解决方法
查看>>