JavaScript多线程详解


Posted in Javascript onAugust 12, 2015

虽然有越来越多的网站在应用AJAX技术进行开发,但是构建一个复杂的AJAX应用仍然是一个难题。

造成这些困难的主要原因是什么呢?是与服务器的异步通信问题?还是GUI程序设计问题呢?通常这两项工作都是由桌面程序来完成的,那究竟为何开发一个可以实现同样功能的AJAX应用就这么困难呢?

大家都知道javascript是单线程执行的,但是又可以通过setTimeout或者setInterval定时执行一个方法,通过Ajax可以在向服务器端发送请求没有收到回应可以继续执行主逻辑。这些是如何做到的呢,下面就来探讨下。

先看如下一段代码:

<html>
  <body>
  <script type="text/javascript">
    function printHello()
    {
      console.time("hello");
    }
    function printHello1()
    {
      console.timeEnd("hello");
    }
    setTimeout(printHello,1000);
    setTimeout(printHello1,5000);
    function wait(time)
    {
      var now = Date.now();
      while(Date.now() - now < time)
      {
      }
    }
    wait(5000);
  </script>
  </body>
</html>

以上代码得执行结果为

hello: 0.124ms

从代码可以看出,printHello 与printHello1几乎是同时执行的。如果对于多线程模型,应该执行间隔是4000ms。

以上的原因是setTimeout只是将事件到时间点压入队列,而不是立即执行。具体何时执行还要看浏览器的空闲程度。

其实虽然javascript是单线程的,但是浏览器是多线程的,典型的浏览器有如下线程:

javascript引擎线程
界面渲染线程
浏览器事件触发线程
Http请求线程

javascript单线程指的是javascript引擎线程单线程处理它的事件队列,而浏览器是事件驱动的,很多事件都是异步的,比如鼠标点击事件,setTimeout,Ajax回调事件,当这些事件发生时,浏览器会将这些事件放入执行队列,待浏览器空闲时再执行。

另外,值得一提的是,ajax调用确实是异步的,浏览器会启动一个新线程来想服务端发送请求,如果设置了回调事件,会根据服务端返回状态将回调事件放入事件队列。

以上所述是本人对JavaScript多线程的理解,个人理解能力有限,还望各位大侠提成宝贵意见,共同学习。希望以上介绍对大家有所帮助。

Javascript 相关文章推荐
jquery 得到当前页面高度和宽度的两个函数
Feb 21 Javascript
javascript new fun的执行过程
Aug 05 Javascript
js 有框架页面跳转(target)三种情况下的应用
Apr 09 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
Mar 31 Javascript
CSS+JS实现点击文字弹出定时自动关闭DIV层菜单的方法
May 12 Javascript
jQuery中extend()和fn.extend()方法详解
Jun 03 Javascript
Angular设置title信息解决SEO方面存在问题
Aug 19 Javascript
简单实现JavaScript图片切换效果
Nov 28 Javascript
vue解决跨域路由冲突问题思路解析
Nov 03 Javascript
微信小程序如何自定义table组件
Jun 29 Javascript
JavaScript的查询机制LHS和RHS解析
Aug 16 Javascript
Vuex的热更替如何实现
Jun 05 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
Aug 12 #Javascript
JavaScript实现同一页面内两个表单互相传值的方法
Aug 12 #Javascript
JavaScript实现点击单选按钮改变输入框中文本域内容的方法
Aug 12 #Javascript
JavaScript检测并限制复选框选中个数的方法
Aug 12 #Javascript
JavaScript入门基础
Aug 12 #Javascript
js实现将选中值累加到文本框的方法
Aug 12 #Javascript
javascript实现简单的分页特效
Aug 12 #Javascript
You might like
PHP函数preg_match_all正则表达式的基本使用详细解析
2013/08/31 PHP
php批量删除cookie的简单实现方法
2015/01/26 PHP
PHP Header失效的原因分析及解决方法
2016/11/16 PHP
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
用JS判断IE版本的代码 超管用!
2011/08/09 Javascript
jQuery Ajax异步处理Json数据详解
2013/11/05 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
js类定义函数时用prototype与不用的区别示例介绍
2014/06/10 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
javascript 操作符(~、&amp;、|、^、)使用案例
2014/12/31 Javascript
javascript实现获取服务器时间
2015/05/19 Javascript
全系IE支持Bootstrap的解决方法
2015/10/19 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
JS与jQuery遍历Table所有单元格内容的方法
2015/12/07 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
Jquery on绑定的事件 触发多次实例代码
2016/12/08 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
解决jquery有正确返回值但不执行success函数的问题
2018/08/20 jQuery
AntV F2和vue-cli构建移动端可视化视图过程详解
2019/10/08 Javascript
小程序实现tab标签页
2020/11/16 Javascript
Python实现简单多线程任务队列
2016/02/27 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
Pandas过滤dataframe中包含特定字符串的数据方法
2018/11/07 Python
CSS3教程(1):什么是CSS3
2009/04/02 HTML / CSS
The Outnet亚太地区:折扣设计师时装店
2019/12/05 全球购物
阿迪达斯新加坡官方网站:adidas新加坡
2019/12/06 全球购物
什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?
2016/08/13 面试题
工程师求职简历的自我评价分享
2013/10/10 职场文书
个人能力自我鉴赏
2014/01/25 职场文书
表扬稿格式范文
2015/01/16 职场文书
机动车交通事故协议书
2015/01/29 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
小程序后台PHP版本部署运行 LNMP+WNMP
2021/04/01 Servers
十大最帅动漫男主 碓冰拓海上榜,第一是《灌篮高手》男主角
2022/03/18 日漫
pandas中pd.groupby()的用法详解
2022/06/16 Python
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python