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日历功能对象
Jan 12 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
Feb 03 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
Aug 25 Javascript
jQuery实现textarea自动增长宽高的方法
Dec 18 Javascript
Bootstrap Chart组件使用教程
Apr 28 Javascript
原生JS实现首页进度加载动画
Sep 14 Javascript
简单理解vue中el、template、replace元素
Oct 27 Javascript
jQuery制作input提示内容(兼容IE8以上)
Jul 05 jQuery
node.js-v6新版安装具体步骤(分享)
Sep 06 Javascript
React学习之事件绑定的几种方法对比
Sep 24 Javascript
Vue实现购物车详情页面的方法
Aug 20 Javascript
Layui表格监听行单双击事件讲解
Nov 14 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对象类型判断
2008/08/27 PHP
php下关于中英数字混排的字符串分割问题
2010/04/06 PHP
PHP容易忘记的知识点分享
2013/04/30 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
JavaScript面象对象设计
2008/04/28 Javascript
JavaScript 应用类库代码
2008/06/02 Javascript
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
datagrid框架的删除添加与修改
2013/04/08 Javascript
Jquery实现页面加载时弹出对话框代码
2013/04/19 Javascript
Jquery 表单验证类介绍与实例
2013/06/09 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
jQuery实现的网格线绘制方法
2016/06/20 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
jQ处理xml文件和xml字符串的方法(详解)
2016/11/22 Javascript
jquery对所有input type=text的控件赋值实现方法
2016/12/02 Javascript
微信小程序开发探究
2016/12/27 Javascript
js实现表格筛选功能
2017/01/18 Javascript
浅谈使用React.setState需要注意的三点
2017/12/18 Javascript
node puppeteer(headless chrome)实现网站登录
2018/05/09 Javascript
webpack4的迁移的使用方法
2018/05/25 Javascript
详解vue axios二次封装
2018/07/22 Javascript
JS中超越现实的匿名函数用法实例分析
2019/06/21 Javascript
微信小程序Echarts图表组件使用方法详解
2019/06/25 Javascript
解决Vue使用bus总线时,第一次路由跳转时数据没成功传递问题
2020/07/28 Javascript
jQuery实现雪花飘落效果
2020/08/02 jQuery
numpy.std() 计算矩阵标准差的方法
2018/07/11 Python
pandas计数 value_counts()的使用
2019/06/24 Python
CSS3+DIV实现漂亮的动画彩色标签
2016/06/16 HTML / CSS
英国和国际包裹递送:ParcelCompare
2019/08/26 全球购物
师范学院毕业生求职信范文
2013/12/26 职场文书
毕业实习评语
2014/02/10 职场文书
实习协议书范本
2014/04/22 职场文书
作弊检讨书范文
2015/05/06 职场文书
学习经验交流会策划书
2015/11/02 职场文书
2019广播稿怎么写
2019/04/17 职场文书