js本质是单线程的,不能做到和java一样两个线程并发。
首先js分为同步和异步代码。
另外,还有任务队列,可以把所有的异步任务加载到队列中。
js不能同时执行两个任务,本质还是单线程。
js中,所谓的 异步,有三种:
第一:鼠标键盘触发事件,例如click,等
第二:网络事件,例如onload等
第三:定时器,例如setTimeout等
因为这些任务的发生都不是在当下,而是过段时间以后再执行。因此时间不可控,你不能因为5秒后要执行一个函数,就让主线程闲置5秒什么都不干吧?所以你只能继续执行后续的同步代码。而当你单击鼠标或滚动窗口时,主线程可能正在执行其它代码,忙着呢!没工夫处理,因此,事件触发线程就负责来接收这个事件,并把要执行的任务暂时保存在任务队列当中。等主线程把手里的同步代码执行
这也就解释了为什么我们总把JS的异步函数叫做回调了,因为真的不是马上执行,而是回头再调的!
所以js单线程的本质就是控制主线程,等有其他操作需要操作的时候,把这个任务插入到主线程的队列中,本质就是单线程