javascript沒(méi)有多線程,所以也不存在多線程同時(shí)運(yùn)行的說(shuō)法。平時(shí)寫(xiě)代碼的時(shí)候需要考慮盡量避免線程阻塞。

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比洮南網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式洮南網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋洮南地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。
比較好的方法就是盡量使用異步+回調(diào)的方式進(jìn)行處理。
一、線程和進(jìn)程基本概念
進(jìn)程:操作系統(tǒng)分配的占有CPU資源的最小單位。擁有獨(dú)立的地址空間。
線程:安排CPU執(zhí)行的最小單位。同一個(gè)進(jìn)程下的所有線程,共享進(jìn)程的地址空間。
簡(jiǎn)單講,計(jì)算機(jī)就像工廠,進(jìn)程是個(gè)大車(chē)間,計(jì)算機(jī)內(nèi)部有很多個(gè)這樣的大車(chē)間。線程是工人,每一個(gè)車(chē)間里的工人至少有一個(gè)。
為什么這么畫(huà)呢?有點(diǎn)一個(gè)挨一個(gè)的效果呢?是因?yàn)橐郧拔揖屠鲜且苫筮M(jìn)程或者線程運(yùn)行時(shí)到底是并行?還是串行?
其實(shí),在單CPU或單核的情況下,宏觀上無(wú)論是進(jìn)程也好,線程也罷,都是并行的。而在微觀下,某一個(gè)具體的時(shí)刻,他們實(shí)際上都是串行的。在多CPU或多核的情況下,才是真正意義的并行。
二、線程和進(jìn)程的關(guān)系、通性
關(guān)系:進(jìn)程中包含著至少一個(gè)線程。在進(jìn)程創(chuàng)建之初,就會(huì)包含一個(gè)線程,這個(gè)線程會(huì)根據(jù)需要,調(diào)用系統(tǒng)庫(kù)函數(shù)去創(chuàng)建其他線程。但需要注意的是,這些線程之間是沒(méi)有層級(jí)關(guān)系的,他們之間協(xié)同完成工作。在整個(gè)進(jìn)程完成工作之后,其中的線程會(huì)被銷毀,釋放資源。
通性:都包含三個(gè)狀態(tài),就緒、阻塞、運(yùn)行。通俗的講,阻塞就是資源未到位,等待資源中。就緒,就是資源到位了,但是CPU未到位,還在運(yùn)行其他。
三、線程的好處
既然,線程和進(jìn)程是存在通性的,那么為什么操作系統(tǒng)還要設(shè)置線程這個(gè)單位,那就說(shuō)說(shuō)線程的幾點(diǎn)好處:
1、在一個(gè)程序中,多個(gè)線程可以同步或者互斥并行完成工作,簡(jiǎn)化了編程模型;
2、線程較進(jìn)程來(lái)講,更輕;
3、線程雖然微觀并行。但是,在一個(gè)進(jìn)程內(nèi)部,一個(gè)線程阻塞后,會(huì)執(zhí)行這個(gè)進(jìn)程內(nèi)部的其他線程,而不是整體阻塞。從某種意義上,提高了CPU的利用率。
四、市面上的通用叫法
單線程與多線程,都指在一個(gè)進(jìn)程內(nèi)的單和多。不要笑我,之前真的不懂。心中那只小羊駝,奔過(guò)來(lái),跑過(guò)去。還抬起了傲嬌的眼睛,看了我一眼,呵呵~~~
五、javaScript單線程執(zhí)行機(jī)制
1、 首先解釋下,單線程和多線程。
什么是單線程?單線程就是一個(gè)進(jìn)程中只有一個(gè)線程。程序順序執(zhí)行,前面的執(zhí)行完,才會(huì)執(zhí)行后面的程序。
什么是多線程?多線程就是一個(gè)進(jìn)程中只有多個(gè)線程。在進(jìn)程內(nèi)部進(jìn)行線程間的切換,由于每個(gè)線程執(zhí)行的時(shí)間片很短,所以在感覺(jué)上是并行的。
2、那么為什么感覺(jué)上javaScript是多線程?而且還支持AJAX異步呢?AJAX是真正的異步嗎?
先說(shuō)明,從哪里可以得出javaScript是單線程。比如你頁(yè)面一上來(lái)就alert(“hello world~”);只要你不關(guān)閉這個(gè)對(duì)話框,后續(xù)的js代碼就不會(huì)再執(zhí)行。因?yàn)椋瑔尉€程就是這樣一步一步的順次執(zhí)行,前面不執(zhí)行完,后面不會(huì)執(zhí)行。也就是說(shuō),在具體的某一時(shí)刻,只有一段代碼在執(zhí)行。
可是,JavaScript明明可以處理各種觸發(fā)事件,感覺(jué)上是異步多線程啊。其實(shí),它的原理是這樣的,JavaScript單線程的執(zhí)行瀏覽器的一個(gè)事件隊(duì)列,要執(zhí)行的函數(shù)和觸發(fā)事件的回調(diào)函數(shù)都被放在這個(gè)隊(duì)列中。比如,我點(diǎn)擊率一下按鈕,之后又將瀏覽器縮小了,那么這兩個(gè)事件的回調(diào)函數(shù)就會(huì)順次地被放在當(dāng)前執(zhí)行的“函數(shù)”之后,再一一執(zhí)行。
那么,既然JavaScript是單線程,那么如何維護(hù)這個(gè)函數(shù)隊(duì)列呢,他分身無(wú)術(shù)啊。這時(shí)候,就需要知道,瀏覽器可不是單線程。雖然,每一個(gè)window只有一個(gè)js引擎,但是瀏覽器是事件驅(qū)動(dòng)的、異步的、多線程的。
瀏覽器內(nèi)部有一個(gè)事件輪詢(event loop),是一個(gè)大的內(nèi)部消息循環(huán),會(huì)輪詢大的消息隊(duì)列,并執(zhí)行。也就是js要處理的事件隊(duì)列,是瀏覽器維護(hù)的。
瀏覽器至少有四個(gè)線程(不同瀏覽器會(huì)有差異): js引擎線程、界面渲染線程、瀏覽器事件觸發(fā)線程、http請(qǐng)求線程。
其實(shí),到這里就說(shuō)的很明白了。但是,又想到了延時(shí)函數(shù)(setTimeout)的例子,感覺(jué)上,因?yàn)闆](méi)有阻塞執(zhí)行,會(huì)感覺(jué)是異步,其實(shí)并不是。只是,js在執(zhí)行到延時(shí)函數(shù)時(shí),會(huì)觸發(fā)瀏覽器的定時(shí)器,到設(shè)置時(shí)間,瀏覽器再將這個(gè)函數(shù)放入執(zhí)行的函數(shù)隊(duì)列,再由JavaScript引擎執(zhí)行。都是在瀏覽器空閑了才會(huì)執(zhí)行。
關(guān)于AJAX的異步,是真正的異步。同樣的道理,在調(diào)用AJAX的時(shí)候,瀏覽器會(huì)開(kāi)辟一個(gè)新的線程,去處理這個(gè)請(qǐng)求,得到響應(yīng)后,如果這個(gè)請(qǐng)求有回調(diào),會(huì)將這個(gè)回調(diào)再放入事件隊(duì)列中。再由JavaScript引擎執(zhí)行。
3、關(guān)于JavaScript的阻塞
瀏覽器雖然是多線程,但是由于JavaScript具有阻塞特性,無(wú)論外鏈還是內(nèi)嵌腳本,在瀏覽器執(zhí)行解釋js腳本的時(shí)候,瀏覽器是不會(huì)去做別的事情的,比如渲染頁(yè)面,而是直到j(luò)s下載并執(zhí)行完畢。
這樣,js腳本的下載、解釋執(zhí)行,會(huì)反該頁(yè)面的繼續(xù)繪制,給用戶帶來(lái)不良的體驗(yàn)。所以,要對(duì)其優(yōu)化,有如下幾點(diǎn):
a、將script內(nèi)嵌和外鏈,在可以的情況下,放在body底部。注:對(duì)于css,瀏覽器是并行下載
b、在頁(yè)面onload后,加載js
c、html5 script標(biāo)簽的defer屬性,在頁(yè)面加載完成后下載
d、使用創(chuàng)建script標(biāo)簽的方式,在頁(yè)面加載完成后添加進(jìn)去。
注:解決阻塞就是一句話,先讓頁(yè)面渲染完,再加載js。
六、Node.js單線程執(zhí)行機(jī)制
腦子就像有問(wèn)題一樣。js都是單線程的了,node.js就是js實(shí)現(xiàn)的,還能是多線程?!!呵呵噠~
Node.js其實(shí)還不是真正意義上的js,他是借用了js語(yǔ)法實(shí)現(xiàn)的,達(dá)到真正意義的非阻塞服務(wù)端語(yǔ)言。但是他的運(yùn)行機(jī)制,也是事件輪詢 (Event Loop)。
不可以的,JavaScript引擎是單線程運(yùn)行的,瀏覽器無(wú)論在什么時(shí)候都只且只有一個(gè)線程在運(yùn)行JavaScript程序。
可以參考下面的文章:
零基礎(chǔ)學(xué)習(xí)java可按照這份大綱來(lái)進(jìn)行學(xué)習(xí)
第一階段:Java專業(yè)基礎(chǔ)課程
階段目標(biāo):
1. 熟練掌握J(rèn)ava的開(kāi)發(fā)環(huán)境與編程核心知識(shí)
2. 熟練運(yùn)用Java面向?qū)ο笾R(shí)進(jìn)行程序開(kāi)發(fā)
3. 對(duì)Java的核心對(duì)象和組件有深入理解
4. 熟練應(yīng)用JavaAPI相關(guān)知識(shí)
5. 熟練應(yīng)用JAVA多線程技術(shù)
6. 能綜合運(yùn)用所學(xué)知識(shí)完成一個(gè)項(xiàng)目
知識(shí)點(diǎn):
1、基本數(shù)據(jù)類型,運(yùn)算符,數(shù)組,掌握基本數(shù)據(jù)類型轉(zhuǎn)換,運(yùn)算符,流程控制。
2、數(shù)組,排序算法,Java常用API,類和對(duì)象,了解類與對(duì)象,熟悉常用API。
3、面向?qū)ο筇匦裕峡蚣埽煜っ嫦驅(qū)ο笕筇匦裕炀毷褂眉峡蚣堋?/p>
4、IO流,多線程。
5、網(wǎng)絡(luò)協(xié)議,線程運(yùn)用。
第二階段:JavaWEB核心課程
階段目標(biāo):
1. 熟練掌握數(shù)據(jù)庫(kù)和MySQL核心技術(shù)
2. 深入理解JDBC與DAO數(shù)據(jù)庫(kù)操作
3. 熟練運(yùn)用JSP及Servlet技術(shù)完成網(wǎng)站后臺(tái)開(kāi)發(fā)
4. 深入理解緩存,連接池,注解,反射,泛型等知識(shí)
5. 能夠運(yùn)用所學(xué)知識(shí)完成自定義框架
知識(shí)點(diǎn):
1、數(shù)據(jù)庫(kù)知識(shí),范式,MySQL配置,命令,建庫(kù)建表,數(shù)據(jù)的增刪改查,約束,視圖,存儲(chǔ)過(guò)程,函數(shù),觸發(fā)器,事務(wù),游標(biāo),建模工具。
2、深入理解數(shù)據(jù)庫(kù)管理系統(tǒng)通用知識(shí)及MySQL數(shù)據(jù)庫(kù)的使用與管理。為Java后臺(tái)開(kāi)發(fā)打下堅(jiān)實(shí)基礎(chǔ)。Web頁(yè)面元素,布局,CSS樣式,盒模型,JavaScript,jQuery。
3、掌握前端開(kāi)發(fā)技術(shù),掌握jQuery。
4、Servlet,EL表達(dá)式,會(huì)話跟蹤技術(shù),過(guò)濾器,F(xiàn)reeMarker。
5、掌握Servlet相關(guān)技術(shù),利用Servlet,JSP相關(guān)應(yīng)用技術(shù)和DAO完成B/S架構(gòu)下的應(yīng)用開(kāi)發(fā)。
6、泛型,反射,注解。
7、掌握J(rèn)AVA高級(jí)應(yīng)用,利用泛型,注解,枚舉完成自己的CRUD框架開(kāi)發(fā)為后續(xù)框架學(xué)習(xí)做鋪墊。
8、單點(diǎn)登錄,支付功能,項(xiàng)目整合,分頁(yè)封裝熟練運(yùn)用JSP及Servlet核心知識(shí)完成項(xiàng)目實(shí)戰(zhàn)。
第三階段:JavaEE框架課程
階段目標(biāo):
1. 熟練運(yùn)用Linux操作系統(tǒng)常見(jiàn)命令及完成環(huán)境部署和Nginx服務(wù)器的配置
2. 熟練運(yùn)用JavaEE三大核心框架:Spring,SpringMVC,MyBatis
3. 熟練運(yùn)用Maven,并使用SpringBoot進(jìn)行快速框架搭建
4. 深入理解框架的實(shí)現(xiàn)原理,Java底層技術(shù),企業(yè)級(jí)應(yīng)用等
5. 使用Shiro,Ztree和Spring,SpringMVC,Mybaits完成企業(yè)項(xiàng)目
知識(shí)點(diǎn):
1、Linux安裝配置,文件目錄操作,VI命令,管理,用戶與權(quán)限,環(huán)境部署,Struts2概述,hiberante概述。
2、Linux作為一個(gè)主流的服務(wù)器操作系統(tǒng),是每一個(gè)開(kāi)發(fā)工程師必須掌握的重點(diǎn)技術(shù),并且能夠熟練運(yùn)用。
3、SSH的整合,MyBatis,SpringMVC,Maven的使用。
4、了解AOP原理,了解中央控制器原理,掌握MyBatis框架,掌握SSM框架的整合。
5、Shiro,Ztree,項(xiàng)目文檔,項(xiàng)目規(guī)范,需求分析,原型圖設(shè)計(jì),數(shù)據(jù)庫(kù)設(shè)計(jì),工程構(gòu)建,需求評(píng)審,配置管理,BUG修復(fù),項(xiàng)目管理等。
6、獨(dú)立自主完成一個(gè)中小型的企業(yè)級(jí)綜合項(xiàng)目的設(shè)計(jì)和整體架構(gòu)的原型和建模。獨(dú)立自主完成一個(gè)大型的企業(yè)級(jí)綜合項(xiàng)目,并具備商業(yè)價(jià)值
JS為我們提供了一個(gè)Worker的類,它的作用就是為了解決這種阻塞的現(xiàn)象。當(dāng)我們使用這個(gè)類的時(shí)候,它就會(huì)向?yàn)g覽器申請(qǐng)一個(gè)新的線程。這個(gè)線程就用來(lái)單獨(dú)執(zhí)行一個(gè)js文件。
var worker = new Worker(js文件路徑);
1
那么這個(gè)語(yǔ)句就會(huì)申請(qǐng)一個(gè)線程用來(lái)執(zhí)行這個(gè)js文件。
當(dāng)然,在主線程中有一些方法來(lái)實(shí)現(xiàn)對(duì)新線程的控制和數(shù)據(jù)的接收。在這里,我們只說(shuō)比較常用的幾個(gè)方法。
1 //postMessage(msg);
2 //postMessage方法把在新線程執(zhí)行的結(jié)果發(fā)送到瀏覽器的js引擎線程里
3 worker.onmessage = function(){
4
7 setTimeout( function(){
8 worker.terminate();
9 //terminate方法用于關(guān)閉worker線程
10 },2000)
11
12 setTimeout( function(){
13 worker = new Worker("js/test22.js");
14 //再次開(kāi)啟worker線程
15 },3000)
在新線程中使用postMessage()方法可以向主線程中發(fā)送一些數(shù)據(jù),主線程中使用worker的onmessage事件來(lái)接收這些數(shù)據(jù),這樣就實(shí)現(xiàn)了js的多線程執(zhí)行和多線程之間數(shù)據(jù)的傳遞。
因?yàn)镴S運(yùn)行在瀏覽器中,是單線程的,每個(gè)window一個(gè)JS線程,既然是單線程的,在某個(gè)特定的時(shí)刻只有特定的代碼能夠被執(zhí)行,并阻塞其它的代碼。而瀏覽器是事件驅(qū)動(dòng)的(Event?driven),瀏覽器中很多行為是異步(Asynchronized)的,會(huì)創(chuàng)建事件并放入執(zhí)行隊(duì)列中。javascript引擎是單線程處理它的任務(wù)隊(duì)列,你可以理解成就是普通函數(shù)和回調(diào)函數(shù)構(gòu)成的隊(duì)列。當(dāng)異步事件發(fā)生時(shí),如mouse?click,?a?timer?firing,?or?an?XMLHttpRequest?completing(鼠標(biāo)點(diǎn)擊事件發(fā)生、定時(shí)器觸發(fā)事件發(fā)生、XMLHttpRequest完成回調(diào)觸發(fā)等),將他們放入執(zhí)行隊(duì)列,等待當(dāng)前代碼執(zhí)行完成。
網(wǎng)站題目:javascript多線程,編程多線程
路徑分享:http://chinadenli.net/article31/dsejosd.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、靜態(tài)網(wǎng)站、面包屑導(dǎo)航、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站改版、App開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)