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+CSS3实现一款简洁大气带滑动效果的弹出层
May 15 Javascript
jQuery focus和blur事件的应用详解
Jan 26 Javascript
Js实现手机发送验证码时按钮延迟操作
Jun 20 Javascript
javascript实现跨域的方法汇总
Jun 25 Javascript
ES6新特征数字、数组、字符串
Oct 01 Javascript
JS实现根据密码长度显示安全条功能
Mar 08 Javascript
AngularJS1.X学习笔记2-数据绑定详解
Apr 01 Javascript
AngularJS中ng-options实现下拉列表的数据绑定方法
Aug 13 Javascript
React router动态加载组件之适配器模式的应用详解
Sep 12 Javascript
微信小程序webview 脚手架使用详解
Jul 22 Javascript
如何在 Vue 表单中处理图片
Jan 26 Vue.js
Vue提供的三种调试方式你知道吗
Jan 18 Vue.js
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实现ODBC数据分页显示一例
2006/10/09 PHP
Google Voice 短信发送接口PHP开源版(2010.5更新)
2010/07/22 PHP
PHP删除数组中空值的方法介绍
2014/04/14 PHP
PHP 开发者该知道的 5 个 Composer 小技巧
2016/02/03 PHP
Yii2使用自带的UploadedFile实现的文件上传
2016/06/20 PHP
PHP反射原理与用法深入分析
2019/09/28 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
Angular1.x复杂指令实例详解
2017/03/01 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
Vue filter介绍及其使用详解
2017/10/21 Javascript
Angular-UI Bootstrap组件实现警报功能
2018/07/16 Javascript
vue 搭建后台系统模块化开发详解
2019/05/01 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
Vue 实现从文件中获取文本信息的方法详解
2019/10/16 Javascript
vue项目在webpack2实现移动端字体自适配功能
2020/06/02 Javascript
pyqt4教程之实现半透明的天气预报界面示例
2014/03/02 Python
asyncio 的 coroutine对象 与 Future对象使用指南
2016/09/11 Python
使用python遍历指定城市的一周气温
2017/03/31 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
2018/04/22 Python
在Python中给Nan值更改为0的方法
2018/10/30 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
使用Pandas的Series方法绘制图像教程
2019/12/04 Python
Python实现文件压缩和解压的示例代码
2020/08/12 Python
Django websocket原理及功能实现代码
2020/11/14 Python
选购世界上最好的美妆品:Cult Beauty
2017/11/03 全球购物
竞聘书格式及范文
2014/03/31 职场文书
在职党员进社区活动总结
2014/07/05 职场文书
ktv好的活动方案
2014/08/15 职场文书
祖国在我心中演讲稿200字
2014/08/28 职场文书
python必学知识之文件操作(建议收藏)
2021/05/30 Python
python三子棋游戏
2022/05/04 Python