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 相关文章推荐
getElementById在任意一款浏览器中都可以用吗的疑问回复
May 13 Javascript
JS event使用方法详解
Apr 28 Javascript
JavaScript性能陷阱小结(附实例说明)
Dec 28 Javascript
使用js写的一个简易的投票
Nov 27 Javascript
jquery中get和post的简单实例
Feb 04 Javascript
javascript函数式编程程序员的工具集
Oct 11 Javascript
详解WordPress开发中get_current_screen()函数的使用
Jan 11 Javascript
使用jsonp实现跨域获取数据实例讲解
Dec 25 Javascript
BootStrapValidator初使用教程详解
Feb 10 Javascript
vue2.0实战之基础入门(1)
Mar 27 Javascript
关于angularJs清除浏览器缓存的方法
Nov 28 Javascript
jQuery动态移除与增加onclick属性的方法详解
Jun 07 jQuery
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
用sql命令修改数据表中的一个字段为非空(not null)的语句
2010/06/04 PHP
二进制交叉权限微型php类分享
2014/02/07 PHP
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
详解php用static方法的原因
2018/09/12 PHP
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
jQuery设置和获取HTML、文本和值示例
2014/07/08 Javascript
node.js中的path.dirname方法使用说明
2014/12/09 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
2015/02/13 Javascript
javascript关于运动的各种问题经典总结
2015/04/27 Javascript
每天一篇javascript学习小结(面向对象编程)
2015/11/20 Javascript
使用NodeJs 开发微信公众号(三)微信事件交互实例
2016/03/02 NodeJs
jQuery遍历json的方法(推荐)
2016/06/12 Javascript
ES6学习教程之Map的常用方法总结
2017/08/03 Javascript
浅谈vue中数据双向绑定的实现原理
2017/09/14 Javascript
JS实现的Object数组去重功能示例【数组成员为Object对象】
2019/02/01 Javascript
Vue替代marquee标签超出宽度文字横向滚动效果
2019/12/09 Javascript
Angular+Ionic使用queryParams实现跳转页传值的方法
2020/09/05 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
Python使用win32com实现的模拟浏览器功能示例
2017/07/13 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
python使用pandas实现数据分割实例代码
2018/01/25 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
对python添加模块路径的三种方法总结
2018/10/16 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
python将音频进行变速的操作方法
2020/04/08 Python
Python 绘制可视化折线图
2020/07/22 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
Kent & Curwen:与大卫·贝克汉姆合作
2017/06/13 全球购物
美国最大的高尔夫发球时间预订网站:TeeOff.com
2018/03/28 全球购物
Linux内核产生并发的原因
2016/11/08 面试题
党支部书记先进事迹
2014/01/17 职场文书
校园环保标语
2014/06/13 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书
Python文件的操作示例的详细讲解
2021/04/08 Python
90行Python代码开发个人云盘应用
2021/04/20 Python
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript