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线程执行一个又一个的任务片段。
以上,就是单线程模拟多线程的过程,叫做轮转时间片。
而且在一个进度条跑一点,另一个进度条跑一点中间的卡顿,我们其实是看不到的,因为它是非常非常短的微秒,这也是能实现模拟的另一个重要原因。
领取专属 10元无门槛券
私享最新 技术干货