線程和單線程的概念:javascript
線程:是操做系統可以進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運做單位。一條線程指的是進程中一個單一順序的控制流,一個進程中能夠併發多個線程,每條線程並行執行不一樣的任務。java
單線程:(上面有說:一條線程指的是進程中一個單一順序的控制流)就是在進程中只有一條線程,在程序執行時,所走的程序路徑按照連續順序排下來,前面的必須處理好,後面的纔會執行。。瀏覽器
爲何JS是單線程?多線程
引用阮一峯老師的回答 ---> JavaScript的單線程,與它的用途有關。做爲瀏覽器腳本語言,JavaScript的主要用途是與用戶互動,以及操做DOM。這決定了它只能是單線程,不然會帶來很複雜的同步問題。好比,假定JavaScript同時有兩個線程,一個線程在某個DOM節點上添加內容,另外一個線程刪除了這個節點,這時瀏覽器應該以哪一個線程爲準?併發
因此,爲了不復雜性,從一誕生,JavaScript就是單線程。異步
js的工做機制:oop
當線程中沒有執行任何同步代碼的前提下才會執行異步代碼,setTimeout是異步代碼,因此setTimeout只能等js空閒纔會執行,但死循環是永遠不會空閒的,因此setTimeout也永遠不會執行。即便setTimeout爲0,他也是等js引擎的代碼執行完以後纔會插入到js引擎線程的最後執行。spa
瀏覽器的內核機制:操作系統
瀏覽器的內核是多線程的,一個瀏覽器通常至少實現三個常駐線程:線程
1. javascript引擎:是基於事件驅動單線程執行的,JS引擎一直等待着任務隊列中任務的到來,而後加以處理,瀏覽器不管何時都只有一個JS線程在運行JS程序。
2. GUI渲染線程:負責渲染瀏覽器界面,當界面須要重排、重繪或因爲某種操做引起迴流時,該線程就會執行。但須要注意 GUI渲染線程與JS引擎是互斥的,當JS引擎執行時GUI線程會被掛起,GUI更新會被保存在一個隊列中等到JS引擎空閒時當即被執行。
3. 事件觸發線程:當一個事件被觸發時該線程會把事件添加到待處理隊列的隊尾,等待JS引擎的處理。這些事件可來自JavaScript引擎當前執行的代碼塊如setTimeOut、也可來自瀏覽器內核的其餘線程如鼠標點擊、AJAX異步請求等,但因爲JS的單線程關係全部這些事件都得排隊等待JS引擎處理。
單線程和異步
看過不少關於 JavaScript 單線程與異步的介紹,大多數都引用這一類例子來講明:單線程就是排隊,前一個任務不完成後一個就不能開始,也就是常說的串行。 飯店點餐,全部人排隊,A顧客點完以後,廚房開始作,作完後A領到餐後,B再開始點餐,廚房又開始作…周而復始,這就是同步,點餐的時候廚房是閒着的,作菜的時候前臺是閒着的。即單線程。全部人都可以很好的理解,這樣作效率過低了!
換個思路,A點完餐後,到一旁等着,服務員將菜單遞給廚房,廚房開始作,而後繼續服務B顧客,當A顧客的餐作好以後,A來隊伍裏插個隊,把餐領走。 聽到這裏,效率高了不少嘛,整個餐廳沒有浪費一點工做力,你們都各司其事。而後做者就下告終論,這就是 JavaScript 的單線程與異步。
關於單線程和異步暫時就先記錄這些東西,後續會補充其餘像event loop等相關知識。內容若有不許確,歡迎你們提出寶貴意見~~~