在js中,可以使用Worker類別來實作多線程,語法格式為「var worker = new Worker(js檔案路徑);」。使用這個類別的時候,它就會向瀏覽器申請一個新的線程,該線程就用來單獨執行一個js檔案。
本教學操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。
我們都知道JS是一種單線程語言,即使是一些異步的事件也是在JS的主線程上運行的(具體是怎麼運行的,可以看我另一篇博客JS代碼運行機制)。像是setTimeout、ajax的非同步請求,或是dom元素的一些事件,都是在JS主執行緒執行的,這些操作並沒有在瀏覽器中開闢新的執行緒去執行,而是當這些非同步操作被操作時或者是被觸發時才進入事件佇列,然後在JS主執行緒中開始運作。
首先說一下瀏覽器的線程,瀏覽器中主要的線程包括,UI渲染線程,JS主線程,GUI事件觸發線程,http請求線程。
JS作為腳本語言,它的主要用途是與使用者互動,以及操作DOM。這決定了它只能是單線程,否則會帶來複雜的同步問題。 (這裡這些問題我們不做研究)
但是單一線程的語言,有一個很致命的確定。如果說一個腳本語言在執行時,其中某一塊的功能在執行時耗費了大量的時間,那麼就會造成阻塞。這樣的項目,使用者體驗是非常差的,所以這種現像在專案的開發過程中是不被允許存在的。
其實JS為我們提供了一個Worker的類,它的作用就是為了解決這個阻塞的現象。當我們使用這個類別的時候,它就會向瀏覽器申請一個新的線程。這個線程就用來單獨執行一個js檔。
var worker = new Worker(js文件路径);
那麼這個語句就會申請一個執行緒用來執行這個js檔案。
當然,在主執行緒中有一些方法來實現對新執行緒的控制和資料的接收。在這裡,我們只說比較常用的幾個方法。
//postMessage(msg); //postMessage方法把在新线程执行的结果发送到浏览器的js引擎线程里 worker.onmessage = function(){ //获取在新线程中执行的js文件发送的数据 用event.data接收数据 console.log( event.data ) }; setTimeout( function(){ worker.terminate(); //terminate方法用于关闭worker线程 },2000) setTimeout( function(){ worker = new Worker("js/test22.js"); //再次开启worker线程 },3000)
在新線程中使用postMessage()方法可以向主線程中發送一些數據,主線程中使用worker的onmessage事件來接收這些數據,這樣就實現了js的多線程執行和多線程之間數據的傳遞。
【推薦學習:javascript高階教學】
#以上是javascript多執行緒如何實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!