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 相关文章推荐
用JavaScript脚本实现Web页面信息交互
Oct 11 Javascript
基于jQuery UI CSS Framework开发Widget的经验
Aug 21 Javascript
js运动框架_包括图片的淡入淡出效果
May 11 Javascript
Jquery对象和Dom对象的区别分析
Nov 20 Javascript
javascript中setTimeout使用指南
Jul 26 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
May 10 Javascript
JavaScript中使用参数个数实现重载功能
Sep 01 Javascript
微信小程序使用Promise简化回调
Feb 06 Javascript
vue下history模式刷新后404错误解决方法
Aug 18 Javascript
如何测量vue应用运行时的性能
Jun 21 Javascript
微信小程序进入广告实现代码实例
Sep 19 Javascript
小程序自定义模板实现吸顶功能
Jan 08 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
第七节--类的静态成员
2006/11/16 PHP
PHP闭包函数传参及使用外部变量的方法
2016/03/15 PHP
php截取视频指定帧为图片
2016/05/16 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
PHP实现的一致性Hash算法详解【分布式算法】
2018/03/31 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
2018/08/17 PHP
jQuery生成asp.net服务器控件的代码
2010/02/04 Javascript
基于jQuery制作迷你背词汇工具
2010/07/27 Javascript
JS连接SQL数据库与ACCESS数据库的方法实例
2013/11/21 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
jQuery Ajax 异步加载显示等待效果代码分享
2016/08/01 Javascript
扩展bootstrap的modal模态框-动态添加modal框-弹出多个modal框
2017/02/21 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
详解Angular2学习笔记之Html属性绑定
2018/01/03 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
LayUI动态设置checkbox不显示的解决方法
2019/09/02 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
2008/09/06 Python
Python对列表排序的方法实例分析
2015/05/16 Python
Python打造出适合自己的定制化Eclipse IDE
2016/03/02 Python
python django 增删改查操作 数据库Mysql
2017/07/27 Python
python使用os.listdir和os.walk获得文件的路径的方法
2017/12/16 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
Python: tkinter窗口屏幕居中,设置窗口最大,最小尺寸实例
2020/03/04 Python
Pycharm修改python路径过程图解
2020/05/22 Python
普罗米修斯教学反思
2014/02/06 职场文书
2014年环境卫生工作总结
2014/11/24 职场文书
团组织推荐意见
2015/06/05 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
《全神贯注》教学反思
2016/02/22 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书
标会主持词应该怎么写?
2019/08/15 职场文书
Oracle 数据仓库ETL技术之多表插入语句的示例详解
2021/04/12 Oracle
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android