浏览器的多线程和js的单线程--前端易混淆知识科普(一)

 问题:js是单线程的,页面是从上往下加载的,那么是不是第一个js没加载完成,第二个js就不加载?然后,引申出来一个问题就是,那css和图片呢?这之间的加载有相互影响吗?

1、什么是线程?什么是进程?什么是单线程?什么是多线程?

  线程是:程序中一个单一的顺序控制流程。每个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。

  进程是:资源分配的基本单位,拥有一个完成的虚拟地址空间。他与线程的关系就是:当进程发生调度时,不同的进程用有不同的虚拟地址空间,而同一进程内的不同线程共享同一地址空间。

  多线程是:在单个程序中同时运行多个线程完成不同的工作。

2、线程的有哪几种状态?

  a)、新建状态:新建一个线程对象;

  b)、就需状态:除了需要CPU的使用权以外,其他运行所需要的资源全部都已经获得。正所谓,万事俱备只欠东风;

  c)、运行状态:就需状态的线程获得了CPU的使用权,开始执行程序代码;

  d)、阻塞状态:运行状态的线程,因为种种原因放弃了CPU的使用权,暂时停止运行,直到再次准备就需进入就需状态,才有机会获得CPU的使用权,接着执行程序;

  e)、死亡状态:线程执行完成,或者出现异常导致意外退出,该线程结束了生命周期。

3、js是单线程的

  js是单线程,指的是js在运行时,同一个时间只能处理一个事情。因此才有了事件队列的概念,前一个任务结束后才会执行下一个任务。

  但是为了解决由于AJAX请求或者定时器等是页面处于一种“假死”状态,影响其他内容的执行,就将所有任务分成两类:同步任务、异步任务。

  js引擎是单线程运行的,浏览器无论在什么时候都有且只有一个线程在运行js程序。

  在js引擎运行脚本期间,浏览器渲染线程都是处于挂起状态的,也就是被“冻结”了。

4、同步任务和异步任务

  js的同步任务是在主线程上排队执行的任务,当前一个执行完毕,再执行下一个。

  异步任务,并不进入主线程,而是进入任务队列,当任务队列通知主线某个异步任务可以执行了,且此时主线程忙完了其他任务后,该异步任务才会进入主线成接着执行。

  区分异步和同步:

    事件不能立马处理得出相应结果,且有一个回调函数处理返回结果,这就是异步的。

5、浏览器的多线程

  js引擎线程,界面渲染线程,浏览器事件触发线程,以及一些异步线程:http请求,setTime*等

 6、页面处理

  

7、总结

  通过上面我们可以知道,资源的加载是互不影响的。js的执行只有一个线程,根据任务队列的顺序依次执行!(完)

  

posted @ 2018-03-07 15:55  z春眠不觉晓z  阅读(909)  评论(0编辑  收藏  举报