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 相关文章推荐
JS代码格式化和语法着色V2
Oct 14 Javascript
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
Jul 21 Javascript
JavaScript ECMA-262-3 深入解析.第三章.this
Sep 28 Javascript
JavaScript实现x秒后自动跳转到一个页面
Jan 03 Javascript
JS模拟的Map类实现方法
Jun 17 Javascript
CSS3 3D 技术手把手教你玩转
Sep 02 Javascript
javascript 中null和undefined区分和比较
Apr 19 Javascript
详解node如何让一个端口同时支持https与http
Jul 04 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
Jul 10 Javascript
js实现省级联动(数据结构优化)
Jul 17 Javascript
vue实现下拉菜单树
Oct 22 Javascript
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
Mar 31 jQuery
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
同时提取多条新闻中的文本一例
2006/10/09 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
prototype 的说明 js类
2006/09/07 Javascript
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
JQuery中的ready函数冲突的解决方法
2010/05/17 Javascript
一个关于javascript匿名函数的问题分析
2012/03/30 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
jquery实现保存已选用户
2014/07/21 Javascript
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
2014/09/26 NodeJs
JavaScript sup方法入门实例(把字符串显示为上标)
2014/10/20 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
jQuery实现的简单折叠菜单(折叠面板)效果代码
2015/09/16 Javascript
Bootstrap每天必学之滚动监听
2016/03/16 Javascript
Angular4实现鼠标悬停3d倾斜效果
2017/10/25 Javascript
vue中v-model动态生成的实例详解
2017/10/27 Javascript
微信小程序版翻牌小游戏
2018/01/26 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
node打造微信个人号机器人的方法示例
2018/04/26 Javascript
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
原生js实现贪吃蛇游戏
2020/10/26 Javascript
Javascript中的奇葩知识,你知道吗?
2021/01/25 Javascript
Python中强大的命令行库click入门教程
2016/12/26 Python
Python中使用支持向量机SVM实践
2017/12/27 Python
Python入门必须知道的11个知识点
2018/03/21 Python
使用TensorFlow实现二分类的方法示例
2019/02/05 Python
python在回调函数中获取返回值的方法
2019/02/22 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
2020/03/11 Python
python爬虫实现获取下一页代码
2020/03/13 Python
python3访问字典里的值实例方法
2020/11/18 Python
Orvis官网:自1856年以来,优质服装、飞钓装备等
2018/12/17 全球购物
简历自我评价怎么写呢?
2014/01/06 职场文书
学雷锋活动总结报告
2014/06/26 职场文书
“向国旗敬礼”主题班会活动设计方案
2014/09/27 职场文书
费城故事观后感
2015/06/10 职场文书
2015年暑假工作总结
2015/07/13 职场文书