JS单线程和异步

线程和单线程的概念:javascript

线程:是操做系统可以进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运做单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中能够并发多个线程,每条线程并行执行不一样的任务。java

单线程:(上面有说:一条线程指的是进程中一个单一顺序的控制流)就是在进程中只有一条线程,在程序执行时,所走的程序路径按照连续顺序排下来,前面的必须处理好,后面的才会执行。。浏览器

 

为何JS是单线程?多线程

引用阮一峰老师的回答 --->  JavaScript的单线程,与它的用途有关。做为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操做DOM。这决定了它只能是单线程,不然会带来很复杂的同步问题。好比,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另外一个线程删除了这个节点,这时浏览器应该以哪一个线程为准?并发

因此,为了不复杂性,从一诞生,JavaScript就是单线程。异步

 

js的工做机制:oop

当线程中没有执行任何同步代码的前提下才会执行异步代码,setTimeout是异步代码,因此setTimeout只能等js空闲才会执行,但死循环是永远不会空闲的,因此setTimeout也永远不会执行。即便setTimeout为0,他也是等js引擎的代码执行完以后才会插入到js引擎线程的最后执行。spa

 

浏览器的内核机制:操作系统

浏览器的内核是多线程的,一个浏览器通常至少实现三个常驻线程:线程

1. javascript引擎:是基于事件驱动单线程执行的,JS引擎一直等待着任务队列中任务的到来,而后加以处理,浏览器不管何时都只有一个JS线程在运行JS程序。

2. GUI渲染线程:负责渲染浏览器界面,当界面须要重排、重绘或因为某种操做引起回流时,该线程就会执行。但须要注意 GUI渲染线程与JS引擎是互斥的,当JS引擎执行时GUI线程会被挂起,GUI更新会被保存在一个队列中等到JS引擎空闲时当即被执行。

3. 事件触发线程:当一个事件被触发时该线程会把事件添加到待处理队列的队尾,等待JS引擎的处理。这些事件可来自JavaScript引擎当前执行的代码块如setTimeOut、也可来自浏览器内核的其余线程如鼠标点击、AJAX异步请求等,但因为JS的单线程关系全部这些事件都得排队等待JS引擎处理。

 

单线程和异步 

看过不少关于 JavaScript 单线程与异步的介绍,大多数都引用这一类例子来讲明:单线程就是排队,前一个任务不完成后一个就不能开始,也就是常说的串行。 饭店点餐,全部人排队,A顾客点完以后,厨房开始作,作完后A领到餐后,B再开始点餐,厨房又开始作…周而复始,这就是同步,点餐的时候厨房是闲着的,作菜的时候前台是闲着的。即单线程。全部人都可以很好的理解,这样作效率过低了!

  换个思路,A点完餐后,到一旁等着,服务员将菜单递给厨房,厨房开始作,而后继续服务B顾客,当A顾客的餐作好以后,A来队伍里插个队,把餐领走。 听到这里,效率高了不少嘛,整个餐厅没有浪费一点工做力,你们都各司其事。而后做者就下告终论,这就是 JavaScript 的单线程与异步。

 

关于单线程和异步暂时就先记录这些东西,后续会补充其余像event loop等相关知识。内容若有不许确,欢迎你们提出宝贵意见~~~