91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript單線程和任務隊列是什么

發布時間:2022-05-11 13:59:51 來源:億速云 閱讀:280 作者:zzz 欄目:數據安全

這篇文章主要講解了“JavaScript單線程和任務隊列是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JavaScript單線程和任務隊列是什么”吧!

一、JavaScript為什么設計為單線程?

JavaScript語言的一大特點就是單線程,換言之就是同一個時間只能做一件事。

for(var j = 0; j < 5; j++) {
 console.log(j);
}
console.log('end');

上面的代碼,只有for循環執行完畢,才會執行end;

JavaScript的單線程,與它的用途有關。作為瀏覽器腳本語言,JavaScript的主要用途就是與用戶互動,以及操作DOM。這決定了它只能是單線程,否則會帶來很復雜的同步問題。

假定JavaScript同時有兩個線程,一個線程在某個DOM節點上添加內容,另一個線程刪除了這個節點,這時瀏覽器應該以哪個線程為準?

所以,為了避免復雜性,從一誕生,JavaScript就是單線程,這已經成了這門語言的核心特征,將來也不會改變。

為了利用多核CPU的計算能力,HTML5提出Web Worker標準,允許JavaScript腳本創建多個線程,但是子線程完全受主線程控制,且不得操作DOM。所以,這個新標準并沒有改變JavaScript單線程的本質。

二、任務隊列

"任務隊列"是一個事件的隊列(也可以理解成消息的隊列),IO設備完成一項任務,就在"任務隊列"中添加一個事件,表示相關的異步任務可以進入"執行棧"了。主線程讀取"任務隊列",就是讀取里面有哪些事件;

我們來解釋一下:

Javascript是單線程的,單線程就意味著所有任務需要排隊,前一個任務結束,才會執行后一個任務。如果前一個任務耗時很長,后一個任務就不得不一直等著。

如果排隊是因為計算量太大,CPU占用高倒也情有可原,但是很多時候CPU是處于空閑狀態或者有很大的空間未被使用,因為IO設備(輸入輸出設備)很慢(比如Ajax操作從網絡讀取數據),只能等結果出來,才可以往下執行。

JavaScript語言的設計者意識到,主線程完全可以不管IO設備,把這些等待中的任務掛起,先運行排在后面的任務。等到IO設備返回了結果,再去執行掛起的任務。

因此,所有任務可以分成兩種,一種是同步任務(synchronous),另一種是異步任務(asynchronous)。

同步任務指的是,在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行后一個任務;

異步任務指的是,不進入主線程、而進入"任務隊列"(task queue)的任務,只有"任務隊列"通知主線程,某個異步任務可以執行了,該任務才會進入主線程執行。

具體來說,異步執行的運行機制如下。(同步執行也是如此,因為它可以被視為沒有異步任務的異步執行。)

所有同步任務都在主線程上執行,形成一個執行棧

主線程之外,還存在一個"任務隊列"(task queue)。只要異步任務有了運行結果,就在"任務隊列"之中放置一個事件。

一旦"執行棧"中的所有同步任務執行完畢,系統就會讀取"任務隊列",看看里面有哪些事件。那些對應的異步任務,于是結束等待狀態,進入執行棧,開始執行。

主線程不斷重復執行上面的第三步。

for(var j = 0; j < 5; j++) {
  console.log(j);
  setTimeout(function() {
    console.log('timeout');
  }, 0);
}

console.log('end');

//結果0 1 2 3 4 end timeout timeout timeout timeout timeout

感謝各位的閱讀,以上就是“JavaScript單線程和任務隊列是什么”的內容了,經過本文的學習后,相信大家對JavaScript單線程和任務隊列是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长子县| 石狮市| 资兴市| 运城市| 济源市| 阿鲁科尔沁旗| 津市市| 婺源县| 台州市| 尉犁县| 息烽县| 石台县| 北流市| 体育| 沙田区| 平度市| 唐河县| 江永县| 镇原县| 沽源县| 延吉市| 周至县| 西安市| 南乐县| 金乡县| 兴业县| 新安县| 石狮市| 二连浩特市| 滦平县| 夹江县| 望城县| 东乡| 洪湖市| 东台市| 六安市| 且末县| 南乐县| 大渡口区| 广宁县| 宁陕县|