Java常用物件操作工具程式碼例項
阿新 • • 發佈:2020-12-10
js是單執行緒的,為什麼可以執行非同步操作呢?
這歸結與瀏覽器(js的宿主環境)通過某種方式使得js具備了非同步的屬性。
區分程序和執行緒:
程序:正在執行中的應用程式。每個程序都自己獨立的記憶體空間。例如:開啟的瀏覽器就是一個程序。
執行緒:程序的子集,是獨立的。執行緒在共享的記憶體空間中執行。
瀏覽器是多程序的。如下圖:
並且每開啟一個頁面就建立了一個獨立的程序。程序內有自己的多執行緒。如果瀏覽器是單程序的,那麼某個頁面崩了,就會影響整個瀏覽器。
瀏覽器有哪些程序:
1.Browser(瀏覽器):瀏覽器的主程序(負責協調,主控)只有一個,作用有:- 負責瀏覽器介面顯示,與使用者互動。如前進,後退等
- 負責各個頁面的管理,建立和銷燬其他程序
- 將Renderer(渲染器)程序得到的記憶體中的Bitmap,繪製到使用者介面上
- 網路資源的管理,下載等
瀏覽器渲染程序(瀏覽器核心)包含的執行緒:
1. GUI渲染執行緒 • 負責渲染瀏覽器介面,解析html,css,構建DOM樹和RenderObject樹,佈局和繪製等。 • 當介面需要重繪(Repaint)或由於某種操作引發迴流(reflow)時,該執行緒就會執行 • 注意,GUI渲染執行緒與JS引擎執行緒是互斥的,當JS引擎執行時GUI執行緒會被掛起(相當於被凍結了),GUI更新會被儲存在一個佇列中等到JS引擎空閒時立即被執行。 2. JS引擎執行緒資源搜尋網站大全 https://www.renrenfan.com.cn 廣州VI設計公司https://www.houdianzi.com
GUI渲染執行緒與JS引擎執行緒互斥:
由於JavaScript是可操縱DOM的,如果在修改這些元素屬性同時渲染介面(即JS執行緒和UI執行緒同時執行),那麼渲染執行緒前後獲得的元素資料就可能不一致了。因此為了防止渲染出現不可預期的結果,瀏覽器設定GUI渲染執行緒與JS引擎為互斥的關係,當JS引擎執行時GUI執行緒會被掛起,GUI更新則會被儲存在一個佇列中等到JS引擎執行緒空閒時立即被執行。 js執行機制:js是單執行緒的,每當執行函式就把函式推入棧中,但有非同步的操作就讓瀏覽器的執行緒(webAPI)去處理,處理完放到任務佇列裡,當主執行緒(執行棧)執行完畢時,如果任務佇列裡有任務,就執行。這也就是為什麼下面程式碼會先輸出b,然後是a的原因。settimeout的函式會放到任務佇列中,而console.log('b')是主執行緒。
setTimeout(() => {
console.log('a');
}, 0);
console.log('b');