欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript的异步和单线程

程序员文章站 2024-01-29 10:30:04
...

什么是单线程

单线程: 就是在同一时间只能做一件事情。
单线程意味这所有的任务都需要排队,执行完一个才能继续执行下一个,但是如果前一个执行很长,后一个任务就需要一直等待。所以这样机会产生问题。

var i,sum = 0;
for(i = 0; i < 99999999; i++){
  sum += 1;
}
console.log(sum)
console.log(2);
//因为循环的太多,会导致页面一直卡在循环阶段。
//因此会采用异步的方式解决这个问题。

异步

我们常用的定时器和事件监听请求都属于异步操作。
主线程完全可以不管I/O设备,挂起处于等待中的任务,先运行排在后面的任务。等到IO设备返回了结果,再回过头,把挂起的任务继续执行下。通俗的话说就是:在执行代码时遇到定时器或事件监听等,会产生异步,讲他们放在队列中,然后继续执行下面的代码。同步的代码执行完毕后执行异步的代码。

console.log(100)
setTimeout(function(){
    console.log(200)
  },1000)
console.log(300);

//100
//300
//200

JavaScript是单线程语言

JavaScript是单线程语言,浏览器只分配给js一个主线程,用来执行任务(函数),但一次只能执行一个任务,这些任务形成一个任务队列排队等候执行,但某些任务是非常耗时的,比如定时器和事件监听,如果让他们和别的任务一样,都老老实实的排队等待执行的话,执行效率会非常的低,甚至导致页面的假死。所以,浏览器为这些耗时任务开辟了另外的线程,主要浏览器定时触发器,浏览器事件触发线程,这些任务是异步的。

异步的机制

JS中所有的任务我们可以把他分为两种,一种是同步任务,一种是异步任务。

整个任务的执行机制是:

1.将所有的同步任务放在主线程上,形成一个执行栈
2.将所有的异步任务都挂起,当达到条件的时候就会放在‘任务队列’中(监听事件,触发事件)
3.执行主线程上的所有同步任务,系统就会在’任务队列’中查看还有那些任务,异步任务结束等待状态,进入执行栈,开始执行
4.系统不断的在主线程和任务列队之间轮询重复上面的第3步奏

浏览器的异步机制

我们已经知道,js一直是单线程执行的,浏览器为几个明显的耗时任务单独开辟线程解决耗时问题,但是js除了这几个明显的耗时问题外,可能我们自己写的程序里面也会有耗时的函数,这种情况怎么处理呢?我们肯定不能自己开辟单独的线程,但我们可以利用浏览器给我们开放的这几个窗口,浏览器定时器线程和事件触发线程是好利用的。