首先說一下瀏覽器的線程,瀏覽器中主要的線程包括,UI渲染線程,JS主線程,GUI事件觸發線程,http請求線程。ajax
JS做爲腳本語言,它的主要用途是與用戶互動,以及操做DOM。這決定了它只能是單線程,不然會帶來很複雜的同步問題。(這裏這些問題咱們不作研究)瀏覽器
可是單線程的語言,有一個很致命的肯定。若是說一個腳本語言在執行時,其中某一塊的功能在執行時耗費了大量的時間,那麼就會形成阻塞。這樣的項目,用戶體驗是很是差的,因此這種現象在項目的開發過程當中是不容許存在的。多線程
其實JS爲咱們提供了一個Worker的類,它的做用就是爲了解決這種阻塞的現象。當咱們使用這個類的時候,它就會向瀏覽器申請一個新的線程。這個線程就用來單獨執行一個js文件。dom
var worker = new Worker(js文件路徑);
那麼這個語句就會申請一個線程用來執行這個js文件。異步
固然,在主線程中有一些方法來實現對新線程的控制和數據的接收。在這裏,咱們只說比較經常使用的幾個方法。post
1 //postMessage(msg); 2 //postMessage方法把在新線程執行的結果發送到瀏覽器的js引擎線程裏 3 worker.onmessage = function(){ 4 //獲取在新線程中執行的js文件發送的數據 用event.data接收數據 5 console.log( event.data ) 6 }; 7 setTimeout( function(){ 8 worker.terminate(); 9 //terminate方法用於關閉worker線程 10 },2000) 11 12 setTimeout( function(){ 13 worker = new Worker("js/test22.js"); 14 //再次開啓worker線程 15 },3000)
在新線程中使用postMessage()方法能夠向主線程中發送一些數據,主線程中使用worker的onmessage事件來接收這些數據,這樣就實現了js的多線程執行和多線程之間數據的傳遞。spa