七、多线程
7.1 线程阻塞
1 | <script> |
7.2 Worker
函数
我们希望当 js
在大量计算的时候,不要阻塞线程
H5
提供了一个 Worker
函数,可以开辟一个新的线程,用于计算
使用方式:
1 | 将要计算的代码提取出来放入一个 js文件中 |
1 | var worker = new Worker("comouted.js"); // 会报错 需要服务器环境 |
7.3 证明是多线程
初始情况下,在定时器中不断的输出
当上面的延时器执行之后,下面的输出语句就会被阻塞
当点击掉弹出框的时候,定时其中的输出语句会接着上一次的结果继续输出
说明 alert
阻塞了当前线程
1 | // 开启延时器 |
后来,我们将要计算的代码放入到另一个 js 文件中,并初始化 Worker函数用于开辟新的线程
当 3s 之后,弹出框出现,定时器中的输出语句虽然被阻塞了,但是仍会多出很多输出语句
说明主线程被阻塞了,但是有另外一个线程在计算
1 | var worker = new Worker("out.js"); |
7.4 postMessage
开辟的额外的线程用于计算,计算的结果可以通过postMessage
向主线程推送
1 | console.log(worker); |
7.5 onmessage
额外的线程向主线程推送的消息,可以通过 onmessage
来获取
1 | // out.js 向主线程推送的消息,可以通过 onmessage来获取 |
1 | worker.onmessage = function(e){ |
举例(斐波那契函数):
1 | var fibonacci =function(n) { |
1 | worker.onmessage = function(e){ |