執行緒與程序:
程序是系統資源分配和排程的單元。乙個執行著的程式就對應乙個程序。在windows中,每乙個開啟的執行的應用程式或後台程式,比如執行中的qq,谷歌瀏覽器,網易雲**,資源管理器等都是乙個程序。乙個程序包括了執行中的程式和程式所使用到的記憶體和系統資源。比如,邊聽**,邊在寫部落格,這 就是開了兩個程序。
同步和非同步:
同步非同步是指程式的行為。同步時程式發出呼叫的時候,一直等待直到返回結果。沒有結果之前不會返回。也就是說,同步是呼叫者主動等待呼叫的過程。
非同步是發出呼叫之後,馬上返回,但是不會馬上返回結果。呼叫者不必主動等待,當被呼叫者得到結果之後會主動通知呼叫者。
上面的概念可能比較官方,不易理解。通俗來說,就是,你去賣煎餅,然後再那等老闆做好之後遞給你,你才能走的過程 就是同步。你去肯德基點餐,然後點完之後,找個位置坐著玩手機,等做好後之後,前台的小哥哥小姐姐的叫號通知你去拿的過程就是非同步。同步就是 只能一件件的事情去做,做完一件,再做一件。而非同步不是,非同步是你再做一件事的等待過程中,可以去做其他的事情。這就是同步和非同步的區分。
console.log(1)console.log('同步
')console.log(2)
//1//同步
//2
console.log(1)settimeout(() => , 0)
console.log(2)//
1//2//
非同步
瀏覽器是單執行緒還是多執行緒?---多執行緒
乙個瀏覽器通常有以下幾個常駐的執行緒:
- 渲染引擎執行緒:顧名思義,該執行緒負責頁面的渲染。
- js引擎: 負責js的解析和執行
- 定時觸發器執行緒: 處理定時事件,比如settimeout,setinterval
- 事件觸發執行緒:處理dom事件
- 非同步http請求執行緒:處理http請求
瀏覽器只分配給js乙個主線程,用來執行任務,但是一次只能執行乙個任務,這些任務形成乙個任務佇列排隊等候執行,但是,前端的某些任務是很消耗時間的,如果,讓他們和別的任務一樣,都老老實實的排隊等待執行,執行效率就會非常的低,甚至導致頁面的假死。所以,瀏覽器為了這些耗時任務,就開闢了另外的執行緒,如: http請求,瀏覽器定時觸發器等,這些任務 都是非同步的,
那js 的單執行緒和非同步 是不是有點自相矛盾呢?單執行緒和非同步確實不能同時為乙個語言的特性,js 選擇了成為單執行緒語言,所以它本身不可能是非同步的,但js的宿主瀏覽器,node等是多執行緒的,宿主環境通過某種方式使得js具備了非同步的屬性。
任務佇列
js任務分為同步任務和非同步任務,同步任務指的是,在主線程上排隊執行的任務,只有錢乙個任務執行完畢,才能執行後乙個任務。非同步任務:不進入主線程,而進入「任務對列」的任務,只有「任務佇列」通知主線程,某個非同步任務可以執行了。該任務才會進入主線程執行。
非同步執行的執行機制:
- 所有的同步任務都在主線程上,形成乙個【執行棧】
- 主線程之外,還存在乙個「任務佇列」。只要非同步任務有了執行結果,就在「任務佇列」之中放置乙個事件。
- 一旦「執行棧」種的所有同步任務執行完畢,系統就會讀取「任務佇列」,看看裡面有哪些事件,那些對應的非同步任務,於是結束等待狀態,進入執行棧,開始執行。
- 主線程不斷重複上面的第三步。
**函式
當主線程開始執行非同步任務,就是執行對應的**函式。
非同步任務必須指定**函式。
js中的非同步之定時器
settimeout(function(),0)console.log(
1);//1
//0
當有耗時任務的時候,會把它放在任務佇列中等待主線程空閒然後再執行。實際再執行的過程中,瀏覽器會預設settimeout以及ajax請求這一類的方法都是耗時程式(儘管可能不耗時)。所以此時的settimeout儘管它推遲時間為0,但是js不會立即執行,而是把它加入任務佇列,當執行完執行棧的同步任務也就是列印1後,再執行settimeout的**函式,列印0。
settimeout(fn,0)的含義是,指定某個任務在主線程最早可得的空閒時間執行。劃重點:::盡早可能。也就是說settimeout 將當前的**函式加入到任務佇列中,當前任務耗時過長,需要等很久,滅有辦法保證,**函式會在指定的時間內執行。
JS 非同步與單執行緒)
js 非同步與單執行緒 題目1.同步和非同步的區別是什麼,試舉例 例子見知識點 區別 1.同步會阻塞 執行,而非同步不會 2.alert 是同步,settimeout 是非同步 題目2.關於 settimeout 結果 1 3 5 2 4 題目3.前端使用非同步的場景有哪些 1.定時任務 setti...
JS非同步和單執行緒舉例
js 需要非同步的根本原因是 js 是單執行緒運 的,即在同 時間只能做 件事,不能 個 ajax 請求由於 絡 較慢,請求需要 5 秒鐘。如果是同步,這 5 秒鐘 就卡死在這 啥也做不了了。非同步的話,就好很多了,5 秒等待就等待了,其他事情不耽誤做,於那 5 秒鐘等待是 速太慢,不是因為 js ...
JS 演變 單執行緒 非同步任務
js是一門指令碼語言 解析型語言 弱型別語言 動態型別語言。歷史演變 js 作為一門指令碼語言,其執行環境 web瀏覽器 node adobe flash dom詳解 1.js 執行在瀏覽器中,是單執行緒的 2.瀏覽器是多執行緒的 3.瀏覽器中的 js 任務1.js主線程 由js引擎提供 2.js同...