首页前端开发HTMLHTML5-Web Workers实现多线程

HTML5-Web Workers实现多线程

时间2024-01-26 17:21:03发布访客分类HTML浏览722
导读:收集整理的这篇文章主要介绍了html5教程-HTML5-Web Workers实现多线程,觉得挺不错的,现在分享给大家,也给大家做个参考。小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。 当在 HT...
收集整理的这篇文章主要介绍了html5教程-HTML5-Web Workers实现多线程,觉得挺不错的,现在分享给大家,也给大家做个参考。小宝典致力于为广大程序猿(媛)提供高品质的代码服务,请大家多多光顾小站,小宝典在此谢过。

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

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

相关代码请到gIThub查看。

 p id=‘container‘>
    /p>
         script>
             window.alert(‘hi‘);
         setTimeout(function(){
                 VAR ul = document.createElement(‘ul‘);
                 var li = document.createElement(‘li‘);
                 var text = document.createTextNode(‘world‘);
                 var container = document.getElementById(‘container‘);
                  li.apPEndChild(text);
                 ul.appendChild(li);
                 container.appendChild(ul);
                 console.LOG(‘done!‘);
         }
    ,2000);
         /script>
    

 

script> window.alert('hi'); setTimeout(function(){ var ul = document.createElement('ul'); var li = document.createElement('li'); var text = document.createTextNode('world'); var container = document.getElementById('container'); li.appendChild(text); ul.appendChild(li); container.appendChild(ul); console.log('done!'); } ,2000); /script>

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


点击确定后

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

我们需要把希望单独执行的javascript代码放到一个单独的js文件中,然后在页面中调用Worker构造函数来创建一个线程,参数是该文件路径,参数存放如果是相对地址,那么要以包含调用WZ"/kf/ware/vc/" target="_blank" class="keylink"> vcmtlcrm51Oy6r8r90+++5Mv51Nq9xbG+zQQyztXVo6zI57n7yse++LbUwre+tqOs0OjSqrGj1qTNrNS0o6jqrdLpK9b3u/ortsu/2qOpoapv4rj2zsS8/rK70OjSqs7Sw8fU2tKzw+bKudPDc2NyaXB0serHqc/Uyr7S/dPDoam8L3A+DQo8cHJlIGNsYXNzPQ=="brush:java; "> var worker = new Worker('src/js/worker.js');

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

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

在其PRototype内有两个重要方法

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

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

相关代码请到github查看。

test_web_worker.htML

     script>
             var worker = new Worker('./worker.js');
             window.alert('hi');
         /script>

worker.js

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

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

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

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

相关代码请到github查看。

 p id=‘container‘>
    /p>
         script>
             window.alert(‘hi‘);
         setTimeout(function(){
                 var ul = document.createElement(‘ul‘);
                 var li = document.createElement(‘li‘);
                 var text = document.createTextNode(‘world‘);
                 var container = document.getElementById(‘container‘);
                  li.appendChild(text);
                 ul.appendChild(li);
                 container.appendChild(ul);
                 console.log(‘done!‘);
         }
    ,2000);
         /script>
    

 

script> window.alert('hi'); setTimeout(function(){ var ul = document.createElement('ul'); var li = document.createElement('li'); var text = document.createTextNode('world'); var container = document.getElementById('container'); li.appendChild(text); ul.appendChild(li); container.appendChild(ul); console.log('done!'); } ,2000); /script>

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


点击确定后

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

我们需要把希望单独执行的javascript代码放到一个单独的js文件中,然后在页面中调用Worker构造函数来创建一个线程,参数是该文件路径,参数存放如果是相对地址,那么要以包含调用WZ"/kf/ware/vc/" target="_blank" class="keylink"> vcmtlcrm51Oy6r8r90+++5Mv51Nq9xbG+zqqyztXVo6zI57n7yse++LbUwre+tqOs0OjSqrGj1qTNrNS0o6jQrdLpK9b3u/ortsu/2qOpoaPV4rj2zsS8/rK70OjSqs7Sw8fU2tKzw+bKudPDc2NyaXB0serHqc/Uyr7S/dPDoaM8L3A+DQo8cHJlIGNsYXNzPQ=="brush:java; "> var worker = new Worker('src/js/worker.js');

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

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

在其prototype内有两个重要方法

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

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

相关代码请到github查看。

test_web_worker.html

     script>
             var worker = new Worker('./worker.js');
             window.alert('hi');
         /script>

worker.js

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

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

觉得可用,就经常来吧! 欢迎评论哦! html5教程,巧夺天工,精雕玉琢。小宝典献丑了!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

ClassdivHTMLhtml5post-format-gallery

若转载请注明出处: HTML5-Web Workers实现多线程
本文地址: https://pptw.com/jishu/587053.html
html元素 HTML的渲染过程

游客 回复需填写必要信息