張春黎
摘要:作為應(yīng)用率較高的下載方案,多線程下載技術(shù)將多線程優(yōu)點(diǎn)充分發(fā)揮了出來(lái),利用多線程基于相同時(shí)間下的下載請(qǐng)求,分割處理下載數(shù)據(jù),各線程對(duì)應(yīng)相應(yīng)的下載內(nèi)容,最后共同組成數(shù)據(jù)文件,由此可使下載效率得到顯著的提升。多線程下載技術(shù)在多個(gè)下載器中有著廣泛的運(yùn)用,包括QQ旋風(fēng)、迅雷等。該研究針對(duì)計(jì)算機(jī)Java多線程下載技術(shù)進(jìn)行了分析,并開(kāi)展實(shí)例分析,借助Runnable接口,對(duì)烏龜和兔子賽跑的過(guò)程、結(jié)局開(kāi)展模擬研究。
關(guān)鍵詞:Java;線程;多線程技術(shù);線程同步
中圖分類(lèi)號(hào):TP393? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A? ? ? 文章編號(hào):1009-3044(2018)36-0016-02
當(dāng)前計(jì)算機(jī)網(wǎng)絡(luò)成為人們獲取資源的重要途徑,在取得資源的過(guò)程中,運(yùn)用的關(guān)鍵方式就是下載??梢詫⑾螺d通道看作是線程,而多線程對(duì)應(yīng)的是將多數(shù)下載通道都打開(kāi)。服務(wù)器擁有下載的功能,用戶(hù)在共享寬帶環(huán)境下,基于優(yōu)先級(jí)狀況,能夠平均化地對(duì)下載線程進(jìn)行分配處理。下載速度會(huì)隨著線程的增多而提高,二者呈正相關(guān)的關(guān)系。多線程下載技術(shù)在當(dāng)下眾多下載軟件中都可以運(yùn)行。
1 網(wǎng)絡(luò)下載技術(shù)及基本構(gòu)架
當(dāng)前在網(wǎng)絡(luò)覆蓋面積逐步擴(kuò)大的過(guò)程中,使用者的數(shù)量明顯增多,大量使用者的訪問(wèn)操作都需要由Wed服務(wù)器做出響應(yīng),所以導(dǎo)致網(wǎng)絡(luò)下載技術(shù)的發(fā)展收到了來(lái)自Wed服務(wù)器性能的限制。對(duì)此,PZP 技術(shù)憑借非中心化、負(fù)載相對(duì)均衡化及資源分散化的特征能夠于共享文件方面得到廣泛運(yùn)用,可以基于客戶(hù)機(jī)結(jié)點(diǎn)對(duì)共享文件進(jìn)行保存,在缺少中央服務(wù)器的情況下,使用者間能夠?qū)ξ募M(jìn)行傳送、共享。借助帶寬(參與節(jié)點(diǎn)),PZP技術(shù)憑借合作下載及多數(shù)結(jié)點(diǎn)彼此傳輸數(shù)據(jù)的途徑,能夠使容量較大的文件傳輸率得到顯著改善,其中就涵蓋e Mule、e Donke及Bit T0rrent等[1]。
P2P、C/S是網(wǎng)絡(luò)下載主要框架類(lèi)型,HTTP下的TP下載建立在C/S架構(gòu)的基礎(chǔ)上,多線程下載途徑形成于客戶(hù)端;但是多源文件傳輸途徑以P2P網(wǎng)絡(luò)結(jié)構(gòu)為基礎(chǔ),形成了e Mule和BT。C/S框架涵蓋了HTTP/FTP下載途徑,該模式下的服務(wù)器存儲(chǔ)了大量的共享文件,使用者在需要時(shí)需要機(jī)遇服務(wù)器對(duì)文件開(kāi)展搜索、下載及共享等操作,因此可以將服務(wù)器看作是數(shù)據(jù)信息的中轉(zhuǎn)站,客戶(hù)端所開(kāi)展的下載、上傳等操作都需要經(jīng)過(guò)這一環(huán)節(jié)。P2P是BT協(xié)議的基礎(chǔ)結(jié)構(gòu),借助相應(yīng)節(jié)點(diǎn)資源,Peerto Pee能夠?qū)ψ越M織網(wǎng)絡(luò)進(jìn)行構(gòu)建,因?yàn)榫W(wǎng)絡(luò)結(jié)點(diǎn)彼此存在對(duì)等的關(guān)系,因此具備服務(wù)、被服務(wù)兩大功能,無(wú)須途徑服務(wù)器,就能夠?qū)ξ募M(jìn)行傳送。
2 可行性分析
2.1 技術(shù)可行性
計(jì)算機(jī)Java語(yǔ)言的關(guān)鍵特點(diǎn)即為多線程技術(shù),借助對(duì)多線程程序進(jìn)行編寫(xiě)的方式,能夠允許計(jì)算機(jī)于同時(shí)對(duì)各項(xiàng)任務(wù)進(jìn)行高效化的處理。利用特定語(yǔ)言能夠編寫(xiě)出靜態(tài)代碼—程序,其本質(zhì)上是計(jì)算機(jī)指令的組合結(jié)果。動(dòng)態(tài)化的執(zhí)行程序也叫作進(jìn)程,涵蓋加載代碼、執(zhí)行代碼和結(jié)束三個(gè)環(huán)節(jié),進(jìn)程也經(jīng)歷了形成-發(fā)展-滅亡。進(jìn)程的下一級(jí)執(zhí)行單位即為線程,其作為進(jìn)程下的獨(dú)立順序控制流。各Java程序均包括主線程(缺?。?,作為Java應(yīng)用程序,main()方法執(zhí)行的主要線索就是主線程;而作為Applet程序,控制瀏覽器對(duì)JavaApplet程序進(jìn)行執(zhí)行、記載操作的關(guān)鍵線索就是主線程。多線程在實(shí)現(xiàn)的過(guò)程中,需要基于主線程對(duì)線程對(duì)象進(jìn)行構(gòu)建。死亡、新建、運(yùn)行、就緒及堵塞是所有線程所具有的狀態(tài)形式。
對(duì)于下載程序功能模塊,借助計(jì)算機(jī)Java 高級(jí)編程語(yǔ)言能夠發(fā)揮其功能,該編程語(yǔ)言有著多方面的優(yōu)勢(shì),已經(jīng)被作為關(guān)鍵開(kāi)發(fā)工具,有著廣泛的應(yīng)用。Java語(yǔ)言的顯著特征即為多線程編程技術(shù)[2]。就多線程編程的概念來(lái)看,其能夠針對(duì)程序任務(wù)進(jìn)行劃分,形成多項(xiàng)并行子任務(wù)。進(jìn)行網(wǎng)絡(luò)編程時(shí),能夠并發(fā)開(kāi)展多項(xiàng)功能。
計(jì)算機(jī)Java下的多線程類(lèi)的具體實(shí)現(xiàn)途徑如下:
1) 對(duì)java.lang.Thread的類(lèi)進(jìn)行拓展,并對(duì)Thread類(lèi)下run方式進(jìn)行覆蓋;
2) 對(duì)java.lang.Runnable接口的類(lèi)的實(shí)現(xiàn)進(jìn)行生成,使java.lang.Thread和Runnable二者的實(shí)例彼此關(guān)聯(lián)。對(duì)于類(lèi)的線程支持,關(guān)鍵由Thread 類(lèi)來(lái)供應(yīng),類(lèi)在獲取線程功能的過(guò)程中,應(yīng)基于計(jì)算機(jī)Java下,使Thread 類(lèi)對(duì)子類(lèi)進(jìn)行派生。在對(duì)包括printThread.java的Thread 類(lèi)進(jìn)行擴(kuò)展時(shí),因?yàn)橄嗤M(jìn)程下很多線程對(duì)存儲(chǔ)空間進(jìn)行了共享,這樣雖然具有一定的便利性,但是也由此產(chǎn)生了訪問(wèn)沖突的弊端[3]。而針對(duì)這類(lèi)問(wèn)題,計(jì)算機(jī)Java語(yǔ)言所具有的機(jī)制能夠有效對(duì)訪問(wèn)沖突問(wèn)題進(jìn)行處理,不會(huì)出現(xiàn)多個(gè)線程在相同的時(shí)間都訪問(wèn)相同數(shù)據(jù)的狀況。若想確保僅借助特定途徑才能對(duì)數(shù)據(jù)對(duì)象進(jìn)行訪問(wèn),就需要發(fā)揮private關(guān)鍵詞的作用,這就要研制出該途徑相對(duì)應(yīng)的機(jī)制,其在synchronized關(guān)鍵詞方面,涵蓋了synchronized塊、synchronized方式。本研究在研發(fā)過(guò)程中運(yùn)用的是 Eclipse下SWT圖形界面技術(shù),同時(shí)也涉及了HttpClient包。
3 java下的多線程
3.1 創(chuàng)建、啟動(dòng)線程
第一種為在Runnable接口實(shí)現(xiàn)過(guò)程中,對(duì)線程類(lèi)進(jìn)行定義:
Runnable 接口類(lèi)型為T(mén)hread myThread = new Thread(target)//target
Runnable下的途徑僅為:
public void run();能夠?qū)€程運(yùn)行體進(jìn)行定義
第二種是對(duì)Thread子類(lèi)進(jìn)行定義,也對(duì)run方式進(jìn)行重寫(xiě):
clasMyThread extends Thread{public void run(){}}
線程類(lèi)在對(duì)新線程進(jìn)行啟動(dòng)的過(guò)程中,需要對(duì)Thread下start()方式進(jìn)行執(zhí)行,若認(rèn)為調(diào)用方式涵蓋了run()方法的調(diào)用,則不能對(duì)新線程進(jìn)行啟動(dòng),這就需要在對(duì)線程進(jìn)行創(chuàng)建的過(guò)程中首選第一種方式,其接口相對(duì)靈活化。
3.2 轉(zhuǎn)換線程狀態(tài)
對(duì)線程 start()方式進(jìn)行調(diào)用后,線程處于就緒形態(tài),時(shí)間片由Cpu進(jìn)行分配,則線程處于運(yùn)行形態(tài),那么時(shí)間片會(huì)結(jié)束,若沒(méi)執(zhí)行結(jié)束run()方法,線程就會(huì)阻塞。
3.3 sleep方法
Thread靜態(tài)方法為:
public static void sleep(long millis)throws InterruptedException
需要及時(shí)捕捉出現(xiàn)的異常狀況:
Thread.currentThread();//獲取當(dāng)下的線程
4 加速文件加載
4.1文件加載算法流程
因?yàn)閷拵У闹萍s影響,基于客戶(hù)端所開(kāi)展的下載操作,對(duì)于客戶(hù)端發(fā)出的請(qǐng)求,由tp=q(ts+tι)服務(wù)器端做出的響應(yīng),二者均可歸屬為串行操作,在實(shí)現(xiàn)過(guò)程中就需要發(fā)揮計(jì)算機(jī)java技術(shù)下加鎖方式的作用。在加載文件時(shí),子線程形成解鎖和重復(fù)加鎖處理。通常獨(dú)立線程在對(duì)文件進(jìn)行下載時(shí),會(huì)遇到很多解鎖的狀況,所以q的大小和fk(鎖粒度)都同Sp(n)(加速比)存在很大的聯(lián)系。文件加載算法流程詳見(jiàn)圖1所示:
4.2 多線程加載文件算法
上述公式中,鎖外消耗時(shí)長(zhǎng)表示為[tp],其占比重表示為q;解及加鎖消耗時(shí)長(zhǎng)表示為[ tι],鎖內(nèi)消耗時(shí)長(zhǎng)表示為[ts]。當(dāng)q是整數(shù)的情況下,意為首次申請(qǐng)才會(huì)形成鎖競(jìng)爭(zhēng),若q是小數(shù),那么會(huì)重復(fù)形成鎖競(jìng)爭(zhēng)。運(yùn)算并行下載時(shí)間的運(yùn)算公式如下:
上述公式中的文件塊數(shù)目表示為N,線程數(shù)目表示為h,[nh]的比值表示為k,機(jī)器處理核數(shù)表示為p,鎖粒度表示為fk,[fk=tsti]。
結(jié)合公式得知:1)若[n]、[q]和[fk]均恒定時(shí),因?yàn)閝等于p,min/線程數(shù)及min/處理核數(shù);2)若[fk]恒定時(shí),,因?yàn)閝等于p,要借助移動(dòng)終端多核處理器,開(kāi)展并行處理操作;3)參考h、q二者的聯(lián)系,包括下述不同狀況:首先為[q ≤ h-1],同q、n及[fk]都存在聯(lián)系,條件吻合時(shí)得到最小[ tn];其次為[q>h-1],同h呈正比,因此不存在最小[tn]。
5 線程之間的同步
對(duì)相同變量進(jìn)行訪問(wèn)的過(guò)程中,對(duì)線程進(jìn)行并行執(zhí)行時(shí),若線程A賦值變量X的過(guò)程中,線程B應(yīng)對(duì)該變量數(shù)值進(jìn)行讀取,線程A沒(méi)有賦值變量X時(shí),B無(wú)法對(duì)數(shù)值進(jìn)行讀取,怎樣解決這樣的問(wèn)題?由此針對(duì)訪問(wèn)變量X的方式,需要借助 synchronized 關(guān)鍵詞進(jìn)行一定的修飾。該方式一旦被線程A所調(diào)用,其余線程就要經(jīng)歷等待的過(guò)程,線程A結(jié)束之后即可運(yùn)用[5]。同步方式就是借助synchronized進(jìn)行說(shuō)明,在設(shè)計(jì)多線程程序中有著廣泛的應(yīng)用,能夠確保單個(gè)線程在相同時(shí)間對(duì)方法進(jìn)行訪問(wèn),將線程間的同步變?yōu)榱爽F(xiàn)實(shí)。協(xié)商、共享不同資源的關(guān)鍵就在于同步。
6 程序示例
6.1 實(shí)現(xiàn)過(guò)程
在對(duì)龜兔賽跑過(guò)程進(jìn)行實(shí)現(xiàn)時(shí),借助就是計(jì)算機(jī)JAVA,而多線程的實(shí)現(xiàn)就運(yùn)用的是Runnable接口,單個(gè)類(lèi)對(duì)Runnable接口進(jìn)行實(shí)現(xiàn)的過(guò)程中,基于該類(lèi)針對(duì)Runnable接口實(shí)現(xiàn)的run( ) 方式,并不能將類(lèi)視作線程類(lèi)。對(duì)線程進(jìn)行啟動(dòng)時(shí),無(wú)法借助類(lèi)的實(shí)例對(duì)start ( ) 方式進(jìn)行直接的調(diào)用,應(yīng)利用Thread類(lèi)對(duì)方法進(jìn)行構(gòu)建。在Thread(Runnable target)完成對(duì)象構(gòu)建的任務(wù)后,對(duì)Thread對(duì)象下start()方法進(jìn)行調(diào)用,由此能夠?qū)Χ嗑€程代碼進(jìn)行運(yùn)行。
6.2 運(yùn)行結(jié)果
結(jié)合龜、兔賽跑的過(guò)程,賽跑結(jié)束對(duì)于烏龜來(lái)說(shuō)需要耗費(fèi)30S;而兔子在前2400M時(shí)耗時(shí)8S,而休息時(shí)長(zhǎng)為12S,21S后繼續(xù)賽跑,4800M于28S結(jié)束,繼續(xù)休息。兔子在休息過(guò)程中烏龜已經(jīng)結(jié)束賽跑。運(yùn)行結(jié)果詳見(jiàn)表1所示:
烏龜、兔子的同時(shí)比賽借助多線程變?yōu)榱爽F(xiàn)實(shí)。實(shí)踐生活所出現(xiàn)的多線程狀況也比較常見(jiàn),包括:很多飛機(jī)或火車(chē)售票口在相同時(shí)間賣(mài)票,各窗口表示獨(dú)立線程。對(duì)于此,存在不同線程對(duì)相同資源進(jìn)行競(jìng)爭(zhēng)的問(wèn)題,代表不同的窗口存在對(duì)相同票進(jìn)行售賣(mài)的可能性。所以在處理過(guò)程中,就需要運(yùn)用多線程同步的技術(shù)。
7 結(jié)束語(yǔ)
結(jié)合Http協(xié)議,借助Java多線程技術(shù)可以對(duì)多線程斷點(diǎn)續(xù)傳程序進(jìn)行編寫(xiě)。系統(tǒng)幫助模塊、設(shè)置管理模塊、任務(wù)管理模塊及下載分類(lèi)管理模塊共同組成了系統(tǒng)框架。子項(xiàng)目Http Client 包存在于Apache Jakarta Commons中,允許運(yùn)行Http協(xié)議,可以對(duì)服務(wù)器端資源進(jìn)行下載操作。多線程斷點(diǎn)續(xù)傳是該程序的關(guān)鍵作用,發(fā)揮多線程技術(shù)的作用,能夠使下載速率得到明顯的改善。
參考文獻(xiàn):
[1] 劉引濤.? 基于Java的多線程下載工具研究與實(shí)現(xiàn)[J]. 現(xiàn)代電子技術(shù),2012(08):11-14.
[2] 耿永利.? 基于Java的網(wǎng)絡(luò)管理系統(tǒng)開(kāi)發(fā)與管理[J]. 漯河職業(yè)技術(shù)學(xué)院學(xué)報(bào),2015(02):34-35.
[3] 姚斌.? 基于JAVA的多線程下載器的設(shè)計(jì)[J]. 信息與電腦:理論版,2014(07):28-29.
[通聯(lián)編輯:光文玲]