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插件写法笔记整理
Sep 06 Javascript
JS实现网页右侧带动画效果的伸缩窗口代码
Oct 29 Javascript
探讨JavaScript语句的执行过程
Jan 28 Javascript
JavaScript的this关键字的理解
Jun 18 Javascript
js的三种继承方式详解
Jan 21 Javascript
Vue computed计算属性的使用方法
Jul 14 Javascript
vue中七牛插件使用的实例代码
Jul 28 Javascript
AngularJS中filter的使用实例详解
Aug 25 Javascript
微信小程序中吸底按钮适配iPhone X方案
Nov 29 Javascript
浅谈vuex actions和mutation的异曲同工
Dec 13 Javascript
JavaScript实现alert弹框效果
Nov 19 Javascript
JS前端使用canvas实现物体的点选示例
Aug 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
destoon各类调用汇总
2014/06/20 PHP
Zend Framework教程之Loader以及PluginLoader用法详解
2016/03/09 PHP
PHP读取大文件的多种方法介绍
2016/04/04 PHP
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
php中通过eval实现字符串格式的计算公式
2017/03/18 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
怎么用javascript进行拖拽
2006/07/20 Javascript
拖动一个HTML元素
2006/12/22 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
jQuery插件windowScroll实现单屏滚动特效
2015/07/14 Javascript
全面了解JavaScript的数据类型转换
2016/07/01 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
微信小程序 wxapp内容组件 progress详细介绍
2016/10/31 Javascript
浅谈JavaScript的函数及作用域
2016/12/30 Javascript
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
谈谈对vue响应式数据更新的误解
2017/08/01 Javascript
JS 使用 window对象的print方法实现分页打印功能
2018/05/16 Javascript
react native 原生模块桥接的简单说明小结
2019/02/26 Javascript
一百行JS代码实现一个校验工具
2019/04/30 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
Vue程序化的事件监听器(实例方案详解)
2020/01/07 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
python 判断自定义对象类型
2009/03/21 Python
基于Python pip用国内镜像下载的方法
2018/06/12 Python
详解Python学习之安装pandas
2019/04/16 Python
python实现接口并发测试脚本
2019/06/25 Python
详解Anaconda 的安装教程
2020/09/23 Python
Python collections.deque双边队列原理详解
2020/10/05 Python
python的setattr函数实例用法
2020/12/16 Python
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
瑞士最大的图书贸易公司:Orell Füssli
2019/12/28 全球购物
董事长岗位职责
2013/11/30 职场文书
《手指教学》反思
2014/02/14 职场文书
python如何利用traceback获取详细的异常信息
2021/06/05 Python