JavaScript單執行緒概念
眾所周知,JavaScript是單執行緒的,由此可能會給初學者帶來很多疑惑。
比如為什麼ajax請求可以是非同步,setTimeout算不算是多執行緒。
首先看一段程式碼例項:
[JavaScript] 純文字檢視 複製程式碼執行程式碼for (var index = 0; index < 100000; index++) { console.log(5); } setTimeout(function () { console.log("螞蟻部落") }, 5);
程式碼本意是在5ms後列印"螞蟻部落",但實際情況是,需要遠遠超過5ms時間後才會列印。
一.JavaScript是單執行緒:
JavaScript在執行過程中單執行緒的,那麼在特定時刻只能有唯一的特定程式碼在執行,並阻塞其他JavaScript程式碼。
瀏覽器是事件驅動(Event driven),這些事件可以源自JavaScript引擎當前執行的程式碼塊,如呼叫setTimeout新增一個任務,也可來自瀏覽器核心的其它執行緒,如介面元素滑鼠點選事件,定時器時間到達通知,非同步請求狀態變更通知等,這些事件的引起結果是對應事件處理函式進入JavaScript單執行緒佇列,排隊等待執行。
二.瀏覽器是多執行緒的:
雖然JavaScript是單執行緒的,但是瀏覽器是多執行緒的,下面瀏覽器幾個最基本執行緒:
(1).JavaScript引擎執行緒。
(2).介面渲染執行緒。
(3).瀏覽器事件觸發執行緒。
(4).Http請求執行緒。
setTimeout和setInterval計數器並不是由JavaScript執行緒實現,而是由瀏覽器實現。
看如下程式碼:
[JavaScript] 純文字檢視 複製程式碼執行程式碼setTimeout(function () { console.log("螞蟻部落") }, 5000);
程式碼會在5秒後列印"螞蟻部落"。當呼叫setTimeou方法之後,瀏覽器提供的執行緒開始進行計數,當5秒之後,將回撥函式放入JavaScript執行緒執行佇列,等待執行。雖然規定在5ms後將回撥函式放入佇列,無奈JavaScript執行緒中還有其他程式碼在執行。
三.ajax非同步請求:
ajax請求確實是非同步的,,不過這請求是由瀏覽器新開一個執行緒請求,當請求的狀態變更時,如果先前已設定回撥函式,此非同步執行緒就將事件處理函式放入JavaScript執行緒的處理佇列中等待處理,當任務被處理時,JavaScript引擎始終是單執行緒執行回撥函式。
相關文章
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- 深入理解JavaScript執行(單執行緒的JS)JavaScript執行緒JS
- 執行緒(一)——執行緒,執行緒池,Task概念+程式碼實踐執行緒
- 多執行緒的概念執行緒
- 執行緒基本概念執行緒
- 執行緒概念淺談執行緒
- 多執行緒詳解(1)——執行緒基本概念執行緒
- 執行緒1-單執行緒執行緒
- Javascript是單執行緒的深入分析JavaScript執行緒
- 多執行緒基本概念執行緒
- 執行緒的基本概念執行緒
- 【java】【多執行緒】程式、執行緒的基本概念(1)Java執行緒
- JavaScript 單執行緒之非同步程式設計JavaScript執行緒非同步程式設計
- web前端教程:如何理解JavaScript的單執行緒?Web前端JavaScript執行緒
- 前端開發技術-剖析JavaScript單執行緒前端JavaScript執行緒
- 淺談Javascript單執行緒和事件迴圈JavaScript執行緒事件
- 深入理解Javascript單執行緒談Event LoopJavaScript執行緒OOP
- 執行緒池的基本概念執行緒
- “多執行緒”重點概念整理執行緒
- Java 多執行緒 相關概念Java執行緒
- redis 單執行緒Redis執行緒
- 單執行緒的 Javascript 為什麼可以非同步執行緒JavaScript非同步
- 細說JavaScript單執行緒的一些事JavaScript執行緒
- C#多執行緒學習(一) 多執行緒的相關概念C#執行緒
- C# 多執行緒學習(1) :多執行緒的相關概念C#執行緒
- iOS多執行緒詳解:概念篇iOS執行緒
- 程式、執行緒和協程的概念執行緒
- 瀏覽器多執行緒和js單執行緒瀏覽器執行緒JS
- 前端開發技術-剖析JavaScript單執行緒 原創前端JavaScript執行緒
- Redis-單執行緒Redis執行緒
- Redis--單執行緒Redis執行緒
- javascript執行緒及與執行緒有關的效能優化JavaScript執行緒優化
- 多執行緒Demo學習(執行緒的同步,簡單的執行緒通訊)執行緒
- SingleThreadExecutor(單執行緒執行器)thread執行緒
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- 以生活例子說明單執行緒與多執行緒執行緒
- redis為什麼用單執行緒不用多執行緒Redis執行緒
- 多執行緒應用初探(一)----(概念,安全)執行緒