freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

基于java多線程的下載器源碼剖析-資料下載頁(yè)

2025-06-23 15:46本頁(yè)面
  

【正文】 //DownloadDemen不斷的獲取DownloadBlock while(true){ block=getDownloadBlock()。 if(block!=null){ (Createnewdownloadthreadfor+block)。 (newDownloadThread(block))。 ().removeDownloadBlock(block)。 } }[java]view plainHYPERLINK copy p//getDownloadBlock()定義如下: privateDownloadBlockgetDownloadBlock(){ downs=()。 if(downs==null||==0) returnnull。 Downloaddownload=downs[0]。 for(Downloaddown:downs){ if(()()) download=down。 } ()。 return()。 } /p[java]view plainHYPERLINK copy //()定義如下所示: publicDownloadBlockgetDownloadBlock(){ return()。 }寫到這里,整個(gè)的系統(tǒng)框架目錄就非常清晰了:Downloader, DownloadDemen, Download 之間是通過DownloadBlock聯(lián)系起來(lái)的。當(dāng)有一個(gè)文件需要下載時(shí),Downloader 把該Download加入到DownloadList中。而Download自身會(huì)通過切分文件創(chuàng)建出多個(gè)DownloadBlock。DownloadDemen每時(shí)每刻都在獲取DownloadBlock,賦予其線程進(jìn)行下載。下一節(jié),我們會(huì)重點(diǎn)講解一下Downloader如何系統(tǒng)中的緩存進(jìn)行處理的。基于Java多線程的下載器源碼剖析(三)分類:JavaHYPERLINK 多線程20120429 11:29657人閱讀評(píng)論(12)收藏舉報(bào)多線程HYPERLINK javaHYPERLINK downloadHYPERLINK 任務(wù)HYPERLINK concurrencyHYPERLINK 網(wǎng)絡(luò)目錄(?)HYPERLINK [+]四:緩存管理在Thread切分文件時(shí),會(huì)創(chuàng)建非常多的DownloadBlock,為了減少創(chuàng)建、銷毀Block所帶來(lái)對(duì)效率上的影響,我們會(huì)把已經(jīng)創(chuàng)建好的DownloadBlock放入到緩存中,當(dāng)Download需要DownloadBlock時(shí)直接從緩存中取得。即我們使用緩存來(lái)對(duì)已經(jīng)申請(qǐng)的內(nèi)存重復(fù)利用。在每個(gè)Download類中都有一個(gè)緩存池,即ConcurrentLinkedQueueDownloadBlock blockCache。而整個(gè)的系統(tǒng)Downloader也會(huì)有一個(gè)大的ConcurrentLinkedQueueDownloadBlock blockCache。那么這兩者是怎樣的關(guān)系呢?在Download類對(duì)文件進(jìn)行切分的時(shí)候,需要?jiǎng)?chuàng)建DownloadBlock,而DownloadBlock是根據(jù)getDownloadBlock函數(shù)來(lái)獲取到的。[java]view plainHYPERLINK copy /** *從blockcache獲取一塊DownloadBlock。 *cache中的block都是已經(jīng)下載完畢的。 * *@paramstartblock塊的下載開始位置 *@paramlengthblock塊需要下載的長(zhǎng)度 *@return返回一個(gè)創(chuàng)建好的block塊。 */ publicDownloadBlockgetDownloadBlock(longstart,longlength){ DownloadBlockblock。 //先從當(dāng)前的Download中看是否有 if(()0) block=()。 else{ block=().getDownloadBlock()。 (this)。 } (start)。 (length)。 returnblock。 }上面的代碼中,首先會(huì)從當(dāng)前Download所擁有的Cache中獲取DownloadBlock,如果有空閑的DownloadBlock,則直接取出。如果沒有則需要從當(dāng)前系統(tǒng)中去申請(qǐng)。當(dāng)當(dāng)前的DownloadBlock使用DownloadThread下載完畢之后,他所擁有的這個(gè)DownloadBlock會(huì)交給其所在的Download,以供剩余新建的DownloadBlock使用。[java]view plainHYPERLINK copy ().putDownloadBlock(block)。而當(dāng)整個(gè)文件都下載完畢之后,需要把當(dāng)前Download的所有緩存歸還給系統(tǒng)(Downloader)[java]view plainHYPERLINK copy for(DownloadBlockblock:blockCache){ ().putDownloadBlock(block)。 }總結(jié):上面的代碼演示了一個(gè)簡(jiǎn)單的內(nèi)管管理模塊。而為了頻繁的申請(qǐng)內(nèi)存所帶來(lái)的效率損耗,我們通過建立blockCache用于緩存當(dāng)前已經(jīng)申請(qǐng)好的DownloadBlock, 這樣可以對(duì)已經(jīng)申請(qǐng)的內(nèi)存重復(fù)利用。五.高效的任務(wù)管理分析與方案在瀏覽網(wǎng)頁(yè)內(nèi)容時(shí),網(wǎng)頁(yè)內(nèi)容一般是超出屏幕高度的,需要向下滾屏的。如下圖所示,用戶瀏覽該網(wǎng)頁(yè),迅速滾屏到最下。于是圖片的載入是順序的,用戶停留的網(wǎng)頁(yè)區(qū)域圖片最后才載入。我們希望的體驗(yàn)是,如下圖所示,用戶在瀏覽網(wǎng)頁(yè),已有圖片1和圖片2已經(jīng)或正在下載,然后迅速滾屏到最下的過程中,下載任務(wù)的優(yōu)先級(jí)不斷調(diào)整,最終如圖所示數(shù)字,用戶所看到的網(wǎng)頁(yè)區(qū)域最高優(yōu)先級(jí)下載。我們先實(shí)驗(yàn)一下,在限速環(huán)境下下載10個(gè)相同文件,下面是分別在擁擠與排隊(duì)模式下的時(shí)間軸:可以看到,一擁而上的下載過程,每個(gè)任務(wù)的速度被平攤了,所有任務(wù)只能全部最后時(shí)段完成,而排隊(duì)模式部分任務(wù)排隊(duì),部分先快速完成,排隊(duì)任務(wù)隨后也能快速完成。爭(zhēng)搶能力與網(wǎng)絡(luò)連接數(shù)  一般來(lái)講網(wǎng)絡(luò)連接數(shù)越多,整體爭(zhēng)搶到的資源越多,但不是絕對(duì)的線性正比關(guān)系的,而且增多到一定程度后網(wǎng)絡(luò)質(zhì)量下降。這些取決于復(fù)雜的網(wǎng)絡(luò)環(huán)境和本機(jī)其他程序的影響。  所以,通過測(cè)試我們會(huì)通過在不同網(wǎng)絡(luò)環(huán)境下測(cè)試,得到最大連接數(shù)的參考值。而且,我們無(wú)法回避的是,在有些情況下有可能出現(xiàn),由于最大連接數(shù)的限制,而性能沒有不限制的好。這里如何動(dòng)態(tài)調(diào)整最大連接數(shù),通過技術(shù)手段探知網(wǎng)絡(luò)狀況,從而智能調(diào)整,應(yīng)該是一個(gè)很好的研究方向。前后臺(tái)任務(wù)  前臺(tái)任務(wù),用戶操作而等待內(nèi)容。這是最高優(yōu)先級(jí)的,而且隨著用戶新操作的出現(xiàn),新任務(wù)賦予更高優(yōu)先級(jí)。可以理解為插到隊(duì)首?! 『笈_(tái)任務(wù),不緊急的或預(yù)備給用戶使用的?! ∮捎谏厦娴姆治?,得到通用的方案是:多個(gè)優(yōu)先級(jí)的隊(duì)列。對(duì)優(yōu)先級(jí)編號(hào),每個(gè)優(yōu)先級(jí)的隊(duì)列都可以通過插隊(duì)首或加隊(duì)尾的方式添加任務(wù)。另外還可以提供調(diào)整優(yōu)先級(jí),移動(dòng)任務(wù)的功能。六. 單例模式Downloader 代表整個(gè)下載系統(tǒng),整個(gè)系統(tǒng)中只有一個(gè)實(shí)例對(duì)象,因此我們需要保證系統(tǒng)中只有一個(gè)實(shí)例對(duì)象。 OK ,我們看如何保證系統(tǒng)中只有一個(gè)單例模式:為了保證系統(tǒng)中只有一個(gè)實(shí)例,就需要限制構(gòu)造函數(shù)的使用,因?yàn)槿绾斡脩艨梢噪S意調(diào)用構(gòu)造函數(shù),其就可以任意的建立多個(gè)實(shí)例。因此我們將構(gòu)造函數(shù)定義為private[java]view plainHYPERLINK copy privateDownloader(DownloaderConfigconfig){ super()。 =config。 start()。 }而為了能夠得到一個(gè)實(shí)例,我們?cè)谠擃愔卸x了一個(gè)靜態(tài)變量[java]view plainHYPERLINK copy privatestaticDownloaderdownloader=null。然后再通過一個(gè)public函數(shù)得到該Downloader的實(shí)例[java]view plainHYPERLINK copy publicstaticDownloadergetInstance(){ if(downloader==null) downloader=newDownloader(newDownloaderConfig())。 returndownloader。 }函數(shù)之所以定義為static,是因?yàn)槲覀儫o(wú)法通過建立類對(duì)象來(lái)調(diào)用類的方法,只能通過類名稱來(lái)調(diào)用該方法,因此必須設(shè)定為static類型。這樣通過這種方式,我們就可以保證系統(tǒng)中只實(shí)例化一個(gè) Downloader對(duì)象總結(jié)這個(gè)系列總共3篇文章,我們通過這3篇文章講解了基于Java多線程實(shí)現(xiàn)一個(gè)下載器的細(xì)節(jié),包括如何利用多線程對(duì)單個(gè)文件進(jìn)行下載,并實(shí)時(shí)計(jì)算下載速率。以及如何對(duì)多個(gè)下載進(jìn)行管理、調(diào)度以及內(nèi)存的管理。
點(diǎn)擊復(fù)制文檔內(nèi)容
范文總結(jié)相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1