JS引擎是单线程的吗?

JS引擎是单线程还是多线程?

这个问题,肯定很多小伙伴知道答案,也就是JS引擎是单线程的。

那什么是单线程呢?单线程的定义是只能同时做1件事情。而与之相对应的,多线程的定义就是能够同时做多件事情。举个栗子,单线程的话,一个程序和另一个程序,它只能在两个程序之中,运行一个程序,不能够同时运行。而多线程的话,就是两个程序可以同时运行。那再对比生活上来说的话,就是比如说地铁,单线程的意思就是同时只能有1趟地铁过去,而对于多线程而言,我们就可以有多条线,然后交叉着或是平行着走。

那么,接下来问题来了,我们这里写2个进度条,绿色按钮控制上面的进度条,而红色按钮则控制下面的进度条。

进度条案例展示效果:

那假如说是单线程的话,也就意味着2个进度条不能同时走。

点击第一个,第一个进度条开始走。

我点击第二个,第二个进度条也开始走了。

那我假如说两个按钮同时点击呢?

假如说是单线程的话,按照我们正常人的思路,我第一个进度条点击了,第二个进度条就应该卡死了;或者第二个进度条点了,第一个进度条就会卡死。

而实际情况,则是这2个进度条可以同时走。

那么这里面,为什么JS引擎是单线程的,而两个进度条可以同时跑呢?按理来说,我们这里2个是完全独立的程序。

那么这里面,我们首先先明确JS引擎它肯定是单线程的,但是它是可以模拟多线程的,那它模拟的方法就是使用轮转时间片。

轮转时间片的定义

短时间之内轮流执行多个任务的片段

轮转时间片的步骤

【1】 任务1 任务2

【2】切分任务1和任务2

【3】随机排列这些任务片段,也就是说不一定任务1的某个片段排到前面,任务2的某个片段排在后面,可能是相反的情况,也就是把任务1和任务2的片段随机地排在一起,组成1个队列。

【4】按照这个队列顺序将任务片段送进JS进程。

【5】JS线程执行一个又一个的任务片段。

以上,就是单线程模拟多线程的过程,叫做轮转时间片。

而且在一个进度条跑一点,另一个进度条跑一点中间的卡顿,我们其实是看不到的,因为它是非常非常短的微秒,这也是能实现模拟的另一个重要原因。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191011A08B5I00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励