1. 进程(process)/线程(thread)

进程process: 电脑端安装很多的应用软件,每当运行一个应用程序,相当于开辟一个进程(而对于浏览器来说,每新建一个页卡访问一个页面,都是新开辟一个进程)

  • 任务管理器可以查看进程

线程thread: 每一个进程中可能还会同时做很多事情,如果程序中需要同时处理很多事情,则需要开辟多个线程(一个线程同时只能做一个事情)

=> 一个进程中,会包含0~多个线程

理解:

  • 每一个饭店是一个进程
  • 饭店里面每一个点餐的服务员就是一个线程

2. JS是单线程的线程

浏览器是‘多线程’的,但是JS渲染或者页面渲染是‘单线程’的

2.1 浏览器中线程的分类

  • GUI渲染线程(渲染和绘制页面)
  • JS引擎线程(运行和渲染JS代码)
  • 事件管控和触发线程
  • 定时器管控和触发线程
  • 异步HTTP请求线程
  • ...

2.2 JS代码的渲染是单线程的

浏览器是多线程的(打开一个页面以后,浏览器至少要分配好几个线程同时去处理事情),但是浏览器只会分配出一个线程去渲染代码(GUI渲染线程),所以说JS是单线程的:‘在JS代码执行过程中,一次只能处理一个事情’

3. 同步与异步

  • 同步编程【单线程】:任务是一次执行,上面的任务没有执行完成,下面的任务是不能去操作的
  • 异步编程【多线程】:同时可以处理很多事情,但是JS中的异步编程是利用浏览器的相关机制构造出来的异步效果

通俗的理解:比如我们在食堂打饭这个场景: 我们在排队打饭,但是当排到B打饭的时候,他的王者荣耀游戏还没有打完(吃饭不积极,思想... )

  • 此时同步编程思想处理的方式就是:我们大家都等B打完游戏,只要B不打饭,后面的也不能打饭(B不会就是食堂老板的儿子吧,这么多人等他打游戏 )
  • 但是异步编程思想处理方式是这样的:不管你的后台有多大,腾不出手,就去旁边的任务队列等着去,等我们大家都打完饭,你的游戏也打完了,再来打饭(这你还怎么猖狂 )

3.1 常见的异步代码

  • 定时器:设置定时器是同步(立即设置),异步指的是间隔多久后执行指定的函数
  • 事件绑定(监听)
  • AJAX的异步请求
  • promise/async/await

4 定时器

  • setTimeout
  • setInterval

4.1 定时器的返回值

返回值:是一个数字,代表当前是第几个定时器

  • 我们后期可以基于clearTimeout / clearInterval 清除定时器
  • 手动把timer赋值为null,后期基于它的值验证是否存在定时器

4.2 浏览器的最小反应时间

  • 定时器是异步的:遇到定时器先不执行,先去执行其他事情,等到所有事情做完再看那个定时器到达时间然后可以立马执行;
  • 定时器的等待时间即使设置为零,也不是立即执行,浏览器有一个最小的等待时间(谷歌5~6MS IE浏览器10~13MS
  • 最小反应时间:在滚动相同的距离下,事件被触发多少次,取决于滚动所用的时间(速度)来决定的,浏览器有最小的反应时间,假设是5MS,整体运动时间100MS,这段时间内,浏览器能够识别出来的次数是100/5 = 20次。同理,如果我们运动1000MS,那么识别触发的次数就是1000/5=200次

4.3 从定时器的执行过程理解它的异步的

  • 把代码拿到栈中执行,当遇到异步代码定时器的时候,会立即把定时器拿到任务队列中去等待一定时间
  • 当把主线程的所有代码执行完毕之后,去任务队列中查看哪个定时器到达时间,把到达时间的定时器拿到栈中执行(这种操作是异步)

=> 遇到定时器不是不处理,而是把它放在任务队列,等到主线程空闲下来,再去任务队列查看,这种操作是异步。中途定时器到达时间了,但是主线程并没有到达时间,此时也不会立即执行定时器,必须等到主线程空闲下来。

4.4 下面是关于定时器的对异步代码的理解,配有图片和注释的说明

4.4.1 题目一

let n = 0;
setTimeout(() => {n++;console.log(n);   //=> 3 (2)
}, 1000);  //一秒钟之后执行
n += 2;
console.log(n);    //=> 2 (1)

4.4.2 题目二

let n = 0;
setTimeout(() => {n++;console.log(n);   //=> 3 (2)
},0);  //写零也不是立即执行,而是有一个最小的等待时间:10ms左右
n += 2;
console.log(n);   //=> 2 (1)

4.4.3 题目三

let n = 10;
setTimeout(() => {n++;console.log(n);    //=>11(3)
}, 0);
console.log(n);  //=>10(1)
for(let i = 0;i < 99999999; i++){}
console.log(n);  //=>10(2)

4.4.4 题目四

time / timeEnd:获取他们中间代码执行所需要的时间(这个时间需要受到电脑配置、和当前电脑运行的环境等多方面因素影响),时间只作为参考

setTimeout(() => {console.log(1);
}, 20);
console.log(2);
setTimeout(() => {console.log(3);
}, 10);
console.log(4);
console.time('AA');
for (let i = 0; i < 90000000; i++) {// do soming
}
console.timeEnd('AA'); //=>AA: 79ms 左右
console.log(5);
setTimeout(() => {console.log(6);
}, 8);
console.log(7);
setTimeout(() => {console.log(8);
}, 15);
console.log(9);

4.4.5 题目五

console.log(1); //=>1(1)
setTimeout(function () {console.log(2);
}, 20);
console.log(3); //=>3(2)
for (let i = 0; i > -1; i++) {} //=>死循环,GUI线程啥都做不了,一直在这加载(其它什么事情都干不了)
console.log(4);
setTimeout(function () {console.log(5);
}, 10);
console.log(6);

5. 事件循环 Event Loop

定义:JS是单线程的,因为浏览器只分配一个线程自上而下加载代码。所以JS中大部分任务都是同步任务。但是一定也有异步任务,定时器、事件绑定等这些都属于异步任务。

而浏览器处理JS中的异步任务是:在JS代码自上而下执行的时候,代码进栈执行,执行完出栈,在这反反复复进行的过程中。当遇到定时器等异步任务的时候,会把当前任务放在等待任务队列(Event Queue)中存起来,并且存起来之后不会影响下面代码的执行,主线程会继续执行。当 把下面的同步任务执行完成之后,主线程空闲下来了会去等待队列找哪一个任务到达指定的时间点,就拿到主线程中去执行。执行完之后再去等待队列中查看...

js 多个定时器_JS中的同步/异步编程相关推荐

  1. html5异步编程,一位前端菜鸟对于JavaScript同步异步编程的了解

    来自一个前端菜鸟的对于JavaScript同步异步编程的了解,以下内容,仅供参考.大家知道,JavaScript的执行环境是单线程的,单线程的好处是执行环境简单,不用去考虑诸如资源同步,死锁等多线程阻 ...

  2. Node.js前置知识点(二):同步/异步

    前言 本文是node.js前置知识系列文章的第二篇,主要介绍 同步/异步:阻塞/非阻塞 的相关概念 (参考来源 见文末的 Reference) 一 什么是 同步/异步 同样从 What的角度开始介绍, ...

  3. js 浅拷贝直接赋值_JS中实现浅拷贝和深拷贝的代码详解

    (一)JS中基本类型和引用类型 JavaScript的变量中包含两种类型的值:基本类型值 和 引用类型值,在内存中的表现形式在于:前者是存储在栈中的一些简单的数据段,后者则是保存在堆内存中的一个对象. ...

  4. jq js json 转字符串_JS中JSON对象和String之间的互转及处理技巧

    json:JavaScript 对象表示法(javascript Object Notation),其实JSON就是一个javaScript的对象(Object)而已. 如有不清楚JSON,可以去w3 ...

  5. js 上下箭头滚动_JS中的this完全讲解,再也不会被this搞晕了

    关于This对象 js 中的this 是一个比较难理解的对象:所以也经常作为面试的考点,考察应聘者的js 基础能力:其实this的指向也就那么几种情况,接下来我们一一看一下: 函数中的this取何值是 ...

  6. js 浅拷贝直接赋值_JS中的赋值、浅拷贝与深拷贝

    作者:奚杰 拷贝是写代码中经常使用的方法.浅拷贝与深拷贝是指拷贝的两种情况.本文将深入探究JS的赋值.浅拷贝与深拷贝. 数据类型 在探究深拷贝与浅拷贝之前,我们先梳理一下JS的数据类型.在JavaSc ...

  7. java数组 js数组的长度_js中split()方法得到的数组长度问题

    定义和用法 split() 方法用于把一个字符串分割成字符串数组. 语法 stringObject.split(separator,howmany) 参数 描述 separator 必需.字符串或正则 ...

  8. ajax中的同步异步

    请求方式,分为GET与POST: GET 最为常见的HTTP请求,普通上网浏览页面就是GET.GET方式的参数请求直接跟在URL后,以问号开始.(JS中用window.location.search获 ...

  9. @async 默认线程池_.NET Web应用中为什么要使用async/await异步编程?

    布莱恩特:.NET Core开发精选文章目录,持续更新,欢迎投稿!​zhuanlan.zhihu.com 前言 1.什么是async/await? await和async是.NET Framework ...

最新文章

  1. 《计算机网络课程设计(第2版)》——3.4节课程设计分析
  2. Java数据结构和算法:位运算
  3. 【复习笔记】电力系统基础
  4. Nginx的正向代理与反向代理
  5. 获取客户端IP和MAC地址
  6. 简历的正确发音和习惯用法
  7. 2014年第五届蓝桥杯C/C++ A组国赛 —— 第三题:日期差
  8. Tornado同步api和异步api混写一例
  9. 红点中国、红杉中国联合领投,WakeData惟客数据完成1000万美元B轮融资
  10. 蓝桥杯基础练习十六进制转十进制
  11. Spring Data Jpa中的save和saveAndFlush方法
  12. Sqlserver 高级篇 非聚集索引原理
  13. 操作系统的概念(定义)
  14. 奥城大学计算机专业,美国硕士双录取院校一览表:
  15. IP协议(网际协议)
  16. CentOS 7设置NTP、SSH服务
  17. Dumpling 导出表内并发优化丨TiDB 工具分享
  18. 华为云存储服务分享文件的方法
  19. nuke11安装教程 nuke11破解教程
  20. 如何在在网站上下载视频

热门文章

  1. Android 播放raw文件夹下音频文件,本地MP3文件播放,播放云端MP3文件,获取MP3文件播放时长
  2. Android应用程序显示未读消息计数
  3. 微信小程序 点击按钮 退出
  4. 手把手教你搭建springboot程序
  5. 面向对象方法使用gluon
  6. 「一本通 4.1 练习 2」简单题
  7. CAS单点登陆的两个原理图
  8. 项目管理之码云和git
  9. 关于NPN和PNP传感器的应用区别(转载)
  10. bzoj 2905 背单词