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 相关文章推荐
wordpress之js库集合研究介绍
Aug 17 Javascript
分别用marquee和div+js实现首尾相连循环滚动效果,仅3行代码
Sep 21 Javascript
js冒泡、捕获事件及阻止冒泡方法详细总结
May 08 Javascript
JavaScript面对国际化编程时的一些建议
Jun 24 Javascript
jQuery中事件与动画的总结分享
May 24 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
Aug 06 Javascript
Bootstrap CSS布局之代码
Dec 17 Javascript
node.js发送邮件email的方法详解
Jan 06 Javascript
详解webpack 最简打包结果分析
Feb 20 Javascript
layer.confirm()右边按钮实现href的例子
Sep 27 Javascript
如何在 Vue 中使用 JSX
Feb 14 Vue.js
ECharts transform数据转换和dataZoom在项目中使用
Dec 24 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弹出提示框并跳转到新页面即重定向到新页面
2014/01/24 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
2014/09/27 PHP
ThinkPHP写数组插入与获取最新插入数据ID实例
2014/11/03 PHP
php+Mysqli利用事务处理转账问题实例
2015/02/11 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
javascript cookie操作类的实现代码小结附使用方法
2010/06/02 Javascript
javascript温习的一些笔记 基础常用知识小结
2011/06/22 Javascript
推荐40个简单的 jQuery 导航插件和教程(下篇)
2012/09/14 Javascript
关于jQuery UI 使用心得及技巧
2012/10/10 Javascript
js数组中如何随机取出一个值
2014/06/13 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
用js传递value默认值的示例代码
2014/09/11 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
【经典源码收藏】jQuery实用代码片段(筛选,搜索,样式,清除默认值,多选等)
2016/06/07 Javascript
js简单时间比较的方法
2016/08/02 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
jQuery EasyUI ProgressBar进度条组件
2017/02/28 Javascript
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
微信小程序实现点击按钮修改字体颜色功能【附demo源码下载】
2017/12/05 Javascript
vue相关配置文件详解及多环境配置详细步骤
2020/05/19 Javascript
[09:47]2018DOTA2亚洲邀请赛4.5SOLO赛 No[o]ne vs Sumail
2018/04/06 DOTA
[03:30]完美盛典趣味短片 CSGO2019年度名场面
2019/12/07 DOTA
python正则表达式抓取成语网站
2013/11/20 Python
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
python实现按行分割文件
2019/07/22 Python
Django框架基础模板标签与filter使用方法详解
2019/07/23 Python
用python介绍4种常用的单链表翻转的方法小结
2020/02/24 Python
CSS3解决移动页面上点击链接触发色块的问题
2016/06/03 HTML / CSS
HTML5触摸事件演化tap事件介绍
2016/03/25 HTML / CSS
HTML5开发动态音频图的实现
2020/07/02 HTML / CSS
采购主管工作职责
2013/12/12 职场文书
竞赛口号大全
2014/06/16 职场文书
领导干部“四风”查摆问题个人整改措施
2014/10/28 职场文书
培训班开班主持词
2015/07/02 职场文书
Python使用scapy模块发包收包
2021/05/07 Python
python 中[0]*2与0*2的区别说明
2021/05/10 Python