什么情況下使用async await 為什么Java堅(jiān)持多線程不選擇協(xié)程?
為什么Java堅(jiān)持多線程不選擇協(xié)程?從java被發(fā)明的頭兩天起,就被定義,定義為一個(gè)多線程的網(wǎng)絡(luò)編程語(yǔ)言。Java大特點(diǎn)并不是跨平臺(tái),只是它的多線程模型(那時(shí)候的C中,并沒(méi)有我們現(xiàn)在看見(jiàn)了的threa
為什么Java堅(jiān)持多線程不選擇協(xié)程?
從java被發(fā)明的頭兩天起,就被定義,定義為一個(gè)多線程的網(wǎng)絡(luò)編程語(yǔ)言。Java大特點(diǎn)并不是跨平臺(tái),只是它的多線程模型(那時(shí)候的C中,并沒(méi)有我們現(xiàn)在看見(jiàn)了的thread,C#還還沒(méi)有不出來(lái))。畢竟近二十年的軟件行業(yè)的增長(zhǎng)比較多不知從何而來(lái)網(wǎng)絡(luò)編程,網(wǎng)絡(luò)編程最常見(jiàn)的模型應(yīng)該是client/server,也就是所謂的C/S,這種編程模型在服務(wù)器端不需要而認(rèn)可客戶端的請(qǐng)求,也就是說(shuō)要有很好的并發(fā)特性--這個(gè)特性要注意感情依賴多線程來(lái)實(shí)現(xiàn)。而java的主戰(zhàn)場(chǎng)應(yīng)該是服務(wù)器端編程。所以多進(jìn)程對(duì)java是頗為有用,不可缺的一環(huán)。
當(dāng)我們我希望引導(dǎo)出協(xié)程,我們想解決什么問(wèn)題。我想究其緣由下面幾點(diǎn):
節(jié)省資源,輕量,具體是:省掉內(nèi)存,每個(gè)線程需要未分配一段棧內(nèi)存,在內(nèi)內(nèi)核里的一些資源節(jié)省分配線程的開(kāi)銷(xiāo)(創(chuàng)建角色和全部銷(xiāo)毀線程要各做兩次syscall)浪費(fèi)大量線程快速切換給了的開(kāi)銷(xiāo)與NIO另外利用非阻塞的編程,增加系統(tǒng)的吞吐可以使用站了起來(lái)越來(lái)越舒服吧不通暢(asyncawait,跑不快是異步的,但寫(xiě)站了起來(lái)感覺(jué)上是不同步的的)我們沒(méi)分開(kāi)來(lái)講下。
先說(shuō)內(nèi)存。拿JavaWeb編程舉例子,一個(gè)tomcat上的woker線程池的大線程數(shù)就像會(huì)配置為50~500之間(目前springboot的默認(rèn)值給的200)。也就是說(shuō)相同最危險(xiǎn)的時(shí)刻是可以進(jìn)行的請(qǐng)求最少也就是這么多。如果沒(méi)有達(dá)到了比較大值,各位真接打一次斷然拒絕處理。如果我每個(gè)線程給128KB,500個(gè)線程放一起的內(nèi)存占用量大概是60MB。如果是真的有瓶頸,也許你CPU,IO,帶寬,DB的CPU等會(huì)有瓶頸,但這點(diǎn)內(nèi)存量的增幅相對(duì)于動(dòng)轍數(shù)個(gè)GB的Java運(yùn)行程序時(shí)進(jìn)程來(lái)說(shuō)隱隱的確是什么大問(wèn)題。
如何提取網(wǎng)頁(yè)中的所有鏈接?
最先,
然后打開(kāi)Visual Studio2019,如下圖所示:
第二步,
然后點(diǎn)擊文件,擴(kuò)建項(xiàng)目,你選C#項(xiàng)目、Linux的控制臺(tái)項(xiàng)目,:圖示:
第十步,
鼠標(biāo)右鍵再點(diǎn)擊解決方案、項(xiàng)目下的依懶項(xiàng),如下圖所示:
鼠標(biāo)左鍵選擇類(lèi)型管理的管理NuGet程序包,然后把會(huì)出現(xiàn)如下圖界面:
再點(diǎn)網(wǎng)頁(yè),輸入輸入AngleSharp名稱,如下圖所示:
選擇上圖第一項(xiàng),點(diǎn)擊右側(cè)的安裝按鈕,如下圖所示:
鼠標(biāo)點(diǎn)擊上圖中的確定按鈕,出現(xiàn)以上界面:
來(lái)表示早就將依懶項(xiàng)AngleSharp直接安裝到了項(xiàng)目中,如下圖所示:
。
第四步,
右鍵右擊解決方案項(xiàng)目下的Program.cs,再打開(kāi)源代碼文件Program.cs,編寫(xiě)200元以內(nèi)代碼,
usingSystem
using
usingAngleSharp
using
namespaceConsoleGetAllLink
{
classProgram
{
///ltsummarygt
///讀取數(shù)據(jù)網(wǎng)頁(yè)的所有鏈接
///lt/summarygt
staticasyncvoidReadAllLink()
{
//創(chuàng)建家族一個(gè)場(chǎng)景
varcontext(())
//以同步異步先打開(kāi)hao123網(wǎng)址首頁(yè)
vardocumentawait()
//查詢hao123網(wǎng)址首頁(yè)中所有的鏈接
varallLinks(mdstrokm.LocalNamea)
//循環(huán)輸出鏈接的名稱和網(wǎng)址
foreach(varlinkoutsideallLinks)
{
IHtmlAnchorElementilinklinkthoughIHtmlAnchorElement
Console.WriteLine(${ilink.TextContent},{})
}
}
staticvoidMain(string[]args)
{
//讀取網(wǎng)頁(yè)的所有鏈接
ReadAllLink()
if(().ToLower()q)
{
}
}
}
}
第五步,
按F5鍵調(diào)試運(yùn)行,如下圖所示:
運(yùn)行結(jié)果:
。