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的$和其它JS发生冲突的快速解决方法
Jan 24 Javascript
JS数字抽奖游戏实现方法
May 04 Javascript
AngularJs实现ng1.3+表单验证
Dec 10 Javascript
第一篇初识bootstrap
Jun 21 Javascript
JS ES6中setTimeout函数的执行上下文示例
Apr 27 Javascript
Echarts基本用法_动力节点Java学院整理
Aug 11 Javascript
Angular利用trackBy提升性能的方法
Jan 26 Javascript
Vue+axios实现统一接口管理的方法
Jul 23 Javascript
JS实现基本的网页计算器功能示例
Jan 16 Javascript
解决Vue的文本编辑器 vue-quill-editor 小图标样式排布错乱问题
Aug 03 Javascript
vue中重定向redirect:‘/index‘,不显示问题、跳转出错的完美解决
Sep 28 Javascript
解决vue项目运行npm run serve报错的问题
Oct 26 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读取csv文件内容的详解
2013/06/18 PHP
PHP实现的简单网络硬盘
2015/07/29 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
laravel学习笔记之模型事件的几种用法示例
2017/08/15 PHP
PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
2018/12/21 PHP
javascript 保存文件到本地实现方法
2012/11/29 Javascript
使用原生js实现页面蒙灰(mask)效果示例代码
2014/06/20 Javascript
angular.foreach 循环方法使用指南
2015/01/06 Javascript
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
javascript实现验证身份证号的有效性并提示
2015/04/30 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
2015/07/05 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
Spring Boot+AngularJS+BootStrap实现进度条示例代码
2017/03/02 Javascript
详解vue.js全局组件和局部组件
2017/04/10 Javascript
jQuery实现选中行变色效果(实例讲解)
2017/07/06 jQuery
详解JavaScript基础知识(JSON、Function对象、原型、引用类型)
2018/01/16 Javascript
基于React+Redux的SSR实现方法
2018/07/03 Javascript
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
react的滑动图片验证码组件的示例代码
2019/02/27 Javascript
浅谈Vue CLI 3结合Lerna进行UI框架设计
2019/04/14 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
python爬虫超时的处理的实例
2018/12/19 Python
python多线程下信号处理程序示例
2019/05/31 Python
python itchat给指定联系人发消息的方法
2019/06/11 Python
Python用Try语句捕获异常的实例方法
2019/06/26 Python
python中列表的切片与修改知识点总结
2019/07/23 Python
Python *args和**kwargs用法实例解析
2020/03/02 Python
会计主管岗位职责范文
2013/11/08 职场文书
物流专业毕业生推荐信范文
2013/11/18 职场文书
优秀护士演讲稿
2014/04/30 职场文书
2014年招商工作总结
2014/11/22 职场文书
雷峰塔导游词
2015/02/09 职场文书
部门优秀员工推荐信
2015/03/24 职场文书
2015年乡镇流动人口工作总结
2015/05/12 职场文书
详解jQuery的核心函数和事件处理
2022/02/18 jQuery