对H5新增多线程的理解与简单使用
由于JavaScript的特性决定了JavaScript语言是一种单线程语言,但是有时候我们需要使用多线程比如进行大量的计算时。H5为此新增了多线程的方法。
在这里我是用JavaScript来实现著名的斐波拉且数列,当我在输入框中输入第一个数字时返回这个数字所在位置的数字值。
主线程与分线程之间的关系图:

1、在不使用多线程时
HTML
<input type="text" placeholder="数值" id="number">
<button id="btn">计算</button>
JavaScript
// 1 1 2 3 5 8 .... f(n) = f(n-1) + f(n-2)
function fibonacci (n) {
return n<=2 ? 1 : fibonacci(n-1) + fibonacci(n-2) //递归调用
}
var input = document.getElementById('number')
document.getElementById('btn').onclick = function () {
var number = input.value
var result = fibonacci(number)
alert(result)
}
在不使用多线程的情况下当我们输入一个较大的数值时,由于是递归调用并且计算量大就会造成页面处于无法操作状态只能等待计算完成后用户才可以操作界面
2、使用H5新增的多线程方法
var input = document.getElementById('number')
document.getElementById('btn').onclick = function () {
var number = input.value
//创建一个worker对象
var worker = new Worker('worker.js')
//绑定接受消息的监听
worker.onmessage = function (event) {
console.log('主线程接受分线程返回的数据:'+event.data)
alert(event.data)
}
//向分线程worker.js发送消息
worker.postMessage(number)
console.log('主线程向分线程发送数据:'+number)
}
分线程worker.js
function fibonacci(n) {
return n<=2 ? 1 : fibonacci(n-1) + fibonacci(n-2)
}
var onmessage = function (event) {
var number = event.data
console.log('分线程接收到了主线程发送的数据:'+number)
//计算
var result = fibonacci(number)
postMessage(result)
console.log('分线程向主线程返回数据:'+result)
}
通过分线程可以实现当用户输入一个较大的数值时,分线程进行计算主线程不受影响从而用户可以对页面进行操作(对输入框进行更改操作)。
多线程的不足:
- 现在还没有被所有浏览器支持。
- 分线程(worker.js)里面的代码不能对DOM进行操作(因为分线程的全局对象不是Windows)。
- 不能跨域 加载js。
- 由于存在主线程与分线程之间的数据交换所以速度慢。
多线程在chorem浏览器本地运行时会报错,所以测试时使用localhost形式的路径访问
对H5新增多线程的理解与简单使用的更多相关文章
- JavaScript可否多线程? 深入理解JavaScript定时机制(转载)
说明:最近写 js 时需要用setinterval函数做定时操作,谁知道,刚开始后运行完好,但一段时间后他就抽风了,定时任务运行的时间间隔越来越短,频率加快,这是一个完全不能容忍的问题,带着一个可以出 ...
- (转载)Java多线程入门理解
转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更 ...
- H5新增属性classList
H5新增属性classList h5中新增了一个classList,原生js可以通过它来判断获取dom节点有无某个class. classList是html元素对象的成员,它的使用非常简单,比如 co ...
- H5新增API
H5新增API 选择器 querySelector()和querySelectorAll(),参数都是css选择器,前者返回符合条件的第一个匹配的元素,如果没有则返回Null,后者返回符合筛选条件的所 ...
- web语义化与h5新增标签
Web语义化就是html告诉我们也告诉机器这一块是什么内容,例如:“这行是一个标题,这几行组成一个段落,这是一个列表,那是一个链接.” Web语义化有三个阶段: 1.h1~h6.thead.ul. ...
- h5新增html标签语义
H5新增常用标签<body> <header>...</header> <nav>...</nav> <article> < ...
- java多线程的理解
java多线程的理解 线程的5种状态:新建,就绪,运行,阻塞,死亡. Thread.sleep:线程 运行状态 转为 阻塞状态,(其它线程启动运行) Thread.yield: 线程 运行 ...
- 【repost】让你一句话理解闭包(简单易懂)
接触javascript很久了,每次理解闭包都似是而非,最近在找Web前端的工作,所以需要把基础夯实一下. 本文是参照了joy_lee的博客 闭包 在她这篇博客的基础上以批注的形式力争把我的理解阐述出 ...
- h5新增标签及css3新增属性
- h5新增的标签 新增元素 说明 video 表示一段视频并提供播放的用户界面 audio 表示音频 canvas 表示位图区域 source 为video和audio提供数据源 track 为vi ...
随机推荐
- 数据分析基础-jupyter notebook-Anaconda-Numpy
数据分析介绍 1.数据分析是什么? 2.数据分析能干什么? 3.为什么利用Python进行数据分析? 4.数据分析过程概述 5.常用库简介 1.数据分析是什么? 数据分析是指用适当的统计分析方法对收集 ...
- C盘满了解决办法之查看文件夹占用的统计界面
TreeSize Free软件,可以实时查看文件夹使用情况: 百度搜索: 下载安装完以后的显示界面如下:
- eureka学习之二:自我保护机制
提供者和消费者:消费者通过注册服务名称,找rpc远程地址,调用提供者的接口 Eureka的自我保护机制:
- aiohttp web服务端(server)样例 (非client)
python版本 python3.6 (其他版本需要小改,版本>python3.4) 参考网址:https://www.cnblogs.com/ameile/p/5589808.html as ...
- iOS 一个新方法:- (void)makeObjectsPerformSelector:(SEL)aSelector;
NSArray 里面的一个方法, - (void)makeObjectsPerformSelector:(SEL)aSelector: 这是一个类似于执行for循环的方法,可以这样用,当需要删除一个v ...
- 11)PHP,单选框和复选框的post提交方式处理
就是一个表单中会有input的checkbox形式,那么怎么处理,就有了问题,一般采用二维数组来处理 代码展示: <!DOCTYPE html PUBLIC "-//W3C//DTD ...
- RDD(六)——分区器
RDD的分区器 Spark目前支持Hash分区和Range分区,用户也可以自定义分区,Hash分区为当前的默认分区,Spark中分区器直接决定了RDD中分区的个数.RDD中每条数据经过Shuffle过 ...
- 在win10下安装ubuntu双系统总结
在打算装双系统前两天,我事先在网上买了一个16G大小的U盘,用来坐启动盘.后来发现其实有4G大小就远远足够的,16G的太浪费了,忘后来人吸取教训.呜呜呜.....下面给大家讲讲我的安装步骤: 参考文章 ...
- 解决 Win7 远程桌面 已停止工作的问题
Windows 7远程桌面登录时崩溃, 错误提示如下: 问题签名: 问题事件名称: APPCRASH 应用程序名: mstsc.exe 应用程序版本: 6.1.7601.18540 应用程序时间戳: ...
- android物理动画、Kotlin客户端、架构组件、菜单效果、应用选择器等源码
Android精选源码 Android一个有趣的Android动画交互设计 android可伸缩日历效果源码 关于界面,全新的卡片风格,支持夜晚模式 Android 用 Kotlin 实现的基于物理的 ...