什么是线程?
提到线程,必不可少提到进程了,百度解释如下:
进程:操作系统分配的占有CPU资源的最小单位。拥有独立的地址空间。
线程:安排CPU执行的最小单位。同一个进程下的所有线程,共享进程的地址空间。
简单讲,计算机就像工厂,进程是个大车间,计算机内部有很多个这样的大车间。线程是工人,每一个车间里的工人至少有一个。
js是单线程还是多线程?
javaScript是单线程执行机制。
ps:
什么是单线程?单线程就是一个进程中只有一个线程。程序顺序执行,前面的执行完,才会执行后面的程序,即一次只能做一件事。
什么是多线程?多线程就是一个进程中只有多个线程。在进程内部进行线程间的切换,由于每个线程执行的时间片很短,所以在感觉上是并行的。
为什么感觉js是多线程?
JavaScript单线程的执行浏览器的一个事件队列,要执行的函数和触发事件的回调函数都被浏览器放在这个队列中,js的“多线程”来源于浏览器的多线程。
浏览器多线程
浏览器中有三个常驻的线程,分别是JS引擎,界面渲染,事件响应。由于这三个线程同时要访问DOM树,所以为了线程安全,浏览器内部需要做互斥:当JS引擎在执行代码的时候,界面渲染和事件响应两个线程是被暂停的。所以当JS出现死循环,浏览器无法响应点击,也无法更新界面。现在的浏览器的JS引擎都是单线程的,尽管多线程功能强大,但是线程同步比较复杂,并且危险,稍有不慎就会崩溃死锁。单线程的好处不必考虑线程同步这样的复杂问题,简单而安全。
setInterval和setTimeout是多线程吗?
setInterval和setTimeout并不是多线程,这两个函数根本上其实是事件触发函数,只是一个定时的事件触发器,它们在合适的时间把一些JS代码塞到JS引擎的队列中。
ps:setTimeout(cbFun, 0),这行代码看似是在0秒之后执行cbFun, 但这并不意味着立即执行。其它真正的意思是立刻把cbFun的代码放到当前JS引擎的队列中。尽管setTimeout的参数是0,但这并不意味着立即执行,在一个事件的响应代码执行完成之后,即使队列中有待执行的代码,浏览器也会先执行页面渲染和响应事件,完成之后再执行队列中的代码。
Ajax异步请求是多线程吗?
异步Ajax确实用了多线程,只是Ajax请求的Http连接部分由浏览器另外开了一个线程执行,执行完毕之后给JS引擎发送一个事件,这时候异步请求的回调代码得以执行。它的执行流程是这样的:
Http请求的执行在另外一个线程中,由于这个线程并不会操作DOM树,所以是可以保证线程安全的。发起Ajax请求和回调函数中间是没有JS执行的,所以页面不会卡死。
如何实现js多线程?
Web Worker
使用方式可参考:
什么时候使用js多线程
个人认为遇到繁琐逻辑,代码量比较大时可以考虑多线程。
特别感谢为本博文提供帮助的文章与网站:
博客园-小马哥:http://www.cnblogs.com/mafeng/p/6292534.html
前端大神-阮一峰:http://www.ruanyifeng.com/blog/2018/07/web-worker.html
w3cschool在线教程:http://www.w3school.com.cn/html5/html_5_webworkers.asp