2019-01-05 | js线程 | UNLOCK

个人所理解的js线程

1、JavaScript 单线程

我们都知道 JS 是单线程,而为啥 JS 是单线程的:
JavaScript 的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?
所以,JavaScript 从诞生就是单线程的,并且一直延续到现在,并成为这门语言的一个特点。

2、JavaScript 允许创建多个线程

由于为了更高效的利用 CPU,允许 JavaScript 创建多个线程。但是子线程受到主线程控制。并且不能操作 DOM

虽然 JavaScript 是单线程的,但是所运行的浏览器并不是单线程的哦,一些耗时的操作,都是由浏览器开辟新的线程完成

3、任务队列

由于 JavaScript 是单线程的,那么必然存在任务堆集,也就是任务队列。后面的操作只能等待前面操作执行完之后,才能继续执行。但是这样很浪费 CPU 空间,因为很多时候,处理的线程只会占 CPU 很小的一点地方。所以,JavaScript 的作者将所有的任务分为了,同步任务跟异步任务。

  • 同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
  • 异步任务指的是,不进入主线程、而进入”任务队列”(task queue)的任务,只有”任务队列”通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。

通常来说,一般具有回调函数的,都会在异步任务队列中。执行异步任务队列中对应的函数,其实就是执行对应的回调函数

4、事件循环(evenLoop)

JavaScript 解析器,不断的从任务队列中,循环读取事件,然后进行对应的处理,这种行为被称之为 事件循环(evenLoop)

其实事件循环总结就一句话:先读取主线程里的代码,等待主线程里所有的代码执行完之后,才会去异步任务队列中查看哪些事件满足条件,如果满足,就会进行执行,执行完之后,再次从主线程到任务队列顺序进行读取。
如果这个地方不懂,可以看一下我之前的文章,JavaScript 从定义到执行的那些事。

补充:所有的函数都是会被丢到等待的事件队列中。主线程会优先处理非函数代码

评论加载中