溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

javascript多線程的實(shí)現(xiàn)方法

發(fā)布時(shí)間:2021-07-20 09:04:27 來(lái)源:億速云 閱讀:452 作者:chen 欄目:web開(kāi)發(fā)

本篇內(nèi)容介紹了“javascript多線程的實(shí)現(xiàn)方法”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

在js中,可以使用Worker類(lèi)來(lái)實(shí)現(xiàn)多線程,語(yǔ)法格式為“var worker = new Worker(js文件路徑);”。使用這個(gè)類(lèi)的時(shí)候,它就會(huì)向?yàn)g覽器申請(qǐng)一個(gè)新的線程,該線程就用來(lái)單獨(dú)執(zhí)行一個(gè)js文件。

本教程操作環(huán)境:windows7系統(tǒng)、javascript1.8.5版、Dell G3電腦。

我們都知道JS是一種單線程語(yǔ)言,即使是一些異步的事件也是在JS的主線程上運(yùn)行的(具體是怎么運(yùn)行的,可以看我另一篇博客JS代碼運(yùn)行機(jī)制)。像setTimeout、ajax的異步請(qǐng)求,或者是dom元素的一些事件,都是在JS主線程執(zhí)行的,這些操作并沒(méi)有在瀏覽器中開(kāi)辟新的線程去執(zhí)行,而是當(dāng)這些異步操作被操作時(shí)或者是被觸發(fā)時(shí)才進(jìn)入事件隊(duì)列,然后在JS主線程中開(kāi)始運(yùn)行。

首先說(shuō)一下瀏覽器的線程,瀏覽器中主要的線程包括,UI渲染線程,JS主線程,GUI事件觸發(fā)線程,http請(qǐng)求線程。

JS作為腳本語(yǔ)言,它的主要用途是與用戶(hù)互動(dòng),以及操作DOM。這決定了它只能是單線程,否則會(huì)帶來(lái)很復(fù)雜的同步問(wèn)題。(這里這些問(wèn)題我們不做研究)

但是單線程的語(yǔ)言,有一個(gè)很致命的確定。如果說(shuō)一個(gè)腳本語(yǔ)言在執(zhí)行時(shí),其中某一塊的功能在執(zhí)行時(shí)耗費(fèi)了大量的時(shí)間,那么就會(huì)造成阻塞。這樣的項(xiàng)目,用戶(hù)體驗(yàn)是非常差的,所以這種現(xiàn)象在項(xiàng)目的開(kāi)發(fā)過(guò)程中是不允許存在的。

其實(shí)JS為我們提供了一個(gè)Worker的類(lèi),它的作用就是為了解決這種阻塞的現(xiàn)象。當(dāng)我們使用這個(gè)類(lèi)的時(shí)候,它就會(huì)向?yàn)g覽器申請(qǐng)一個(gè)新的線程。這個(gè)線程就用來(lái)單獨(dú)執(zhí)行一個(gè)js文件。

var worker = new Worker(js文件路徑);

那么這個(gè)語(yǔ)句就會(huì)申請(qǐng)一個(gè)線程用來(lái)執(zhí)行這個(gè)js文件。

當(dāng)然,在主線程中有一些方法來(lái)實(shí)現(xiàn)對(duì)新線程的控制和數(shù)據(jù)的接收。在這里,我們只說(shuō)比較常用的幾個(gè)方法。

//postMessage(msg);
//postMessage方法把在新線程執(zhí)行的結(jié)果發(fā)送到瀏覽器的js引擎線程里
worker.onmessage = function(){
    //獲取在新線程中執(zhí)行的js文件發(fā)送的數(shù)據(jù) 用event.data接收數(shù)據(jù)
    console.log( event.data )
};
setTimeout( function(){
    worker.terminate();
    //terminate方法用于關(guān)閉worker線程
},2000)

setTimeout( function(){
    worker = new Worker("js/test22.js");
    //再次開(kāi)啟worker線程
},3000)

在新線程中使用postMessage()方法可以向主線程中發(fā)送一些數(shù)據(jù),主線程中使用worker的onmessage事件來(lái)接收這些數(shù)據(jù),這樣就實(shí)現(xiàn)了js的多線程執(zhí)行和多線程之間數(shù)據(jù)的傳遞。

“javascript多線程的實(shí)現(xiàn)方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI