韓曉艷 袁堂青
摘要:近些年,國內(nèi)的科技有了長遠的發(fā)展,在我們的日常生活中,計算機也實現(xiàn)了普及,對我們的生產(chǎn)生活影響也越來越大。目前,多線程下載技術(shù)作為目前應(yīng)用非常高的下載方案,將多線程的優(yōu)勢充分發(fā)揮了出來。通過多線程,相同時間的下載請求,可以對下載數(shù)據(jù)進行分割處理,各線程對應(yīng)不同的下載內(nèi)容,在最后組成文件,這樣就能夠有效提高下載的效率?,F(xiàn)階段,很多下載軟件都應(yīng)用了多線程下載技術(shù)。基于這一情況,該文就Java多線程下載技術(shù)開展分析研究。
關(guān)鍵詞:Java;多線程技術(shù);線程安全;計算機
中圖分類號:TP311? ? ? ? 文獻標(biāo)識碼:A
文章編號:1009-3044(2019)22-0071-02
開放科學(xué)(資源服務(wù))標(biāo)識碼(OSID):
近些年我國經(jīng)濟實現(xiàn)了跳躍式的發(fā)展,人們的生活水平有了很大的提高,計算機網(wǎng)絡(luò)也已經(jīng)得到了普及。目前,人們下載網(wǎng)絡(luò)資源是獲取信息最主要的一種途徑。在獲取網(wǎng)絡(luò)資源的過程中,最重要的就是下載技術(shù),而一個線程可以看作一個下載通道,多個線程就可以對應(yīng)多個下載通道。在相同環(huán)境下,如果有了多線程技術(shù),那么下載速度就會有一定程度的提高。在目前多種下載軟件中,都應(yīng)用了多線程下載技術(shù),具有非常大的優(yōu)勢。
1 線程的基本概念及其優(yōu)劣
1.1 線程的基本概念
計算機中正在執(zhí)行的程序,被稱為“進程”,相對于程序來說,進程是一個動態(tài)的概念,是程序的一次執(zhí)行過程。線程相比較進程來說,屬于更小的運行單位,一個進程涵蓋了很多個線程,同樣能夠為用戶處理更多的問題。比如,IE瀏覽器在同時下載圖片的時候,還可以為用戶提供已經(jīng)完成下載的頁面,這也是比較典型的例子。
各進程之間是相互獨立的,彼此之間對其他線程是否存在不需要考慮。在一個任務(wù)中,線程屬于區(qū)中的一個執(zhí)行代碼,不同的線程之間可能會有一定的影響彼此存在一定的聯(lián)系,多個線程對資源進行共享。
1.2 多線程技術(shù)的優(yōu)缺點
多線程技術(shù)不但可以提高交互式,而且能夠更加高效、便捷地進行控制。在對多線程應(yīng)用的時候,可以使程序響應(yīng)速度得到提高,從而實現(xiàn)速度化、高效化的特點。另外,多線程技術(shù)存在的缺點也比較明顯,需要等待比較長的時間之外,還會在一定程度上使程序運行速度降低,使工作效率受到一定的影響,從而對資源造成了浪費。
2 下載技術(shù)框架
2.1 網(wǎng)絡(luò)下載技術(shù)
現(xiàn)階段,我國的網(wǎng)絡(luò)覆蓋面積正在快速地擴大,使用網(wǎng)絡(luò)的人員也越來越多,據(jù)相關(guān)統(tǒng)計顯示,截至2017年,我國網(wǎng)民規(guī)模超過7億,全年共計新增網(wǎng)民4000多萬人?;ヂ?lián)網(wǎng)普及率超過了55.0%。越來越多的使用者,都需要通過Wed服務(wù)器實現(xiàn)訪問操作,這就致使網(wǎng)絡(luò)下載速度受到Wed服務(wù)器性能的制約?;谶@一情況,P2P技術(shù)就憑借自身的優(yōu)勢,廣泛應(yīng)用到了共享文件方面,主要特征包括:資源分散化、負(fù)載相對均衡化以及非中心化,能夠基于客戶機結(jié)點保存共享文件。在中央服務(wù)器缺少時,用戶也可以進行共享、傳送文件的操作。PZP技術(shù)利用多數(shù)結(jié)點傳輸數(shù)據(jù)和合作下載的方式,最大限度地改善文件傳輸?shù)男省?/p>
2.2 下載的基本構(gòu)架
目前網(wǎng)絡(luò)下載的基本架構(gòu)是P2P、C/S架構(gòu)。P2P網(wǎng)絡(luò)結(jié)構(gòu)發(fā)展出多源文件傳輸途徑,主要應(yīng)用有e Mule和BT;C/S架構(gòu)即客戶端/服務(wù)器架構(gòu),由此發(fā)展出的TP下載,是在客戶端應(yīng)用多線程下載模式。傳統(tǒng)的HTTP/FTP下載屬于C/S框架的一種,這一模式下的服務(wù)器需要存儲海量的共享文件,用于文件的共享、下載以及搜索。但是也意味著大量客戶端的數(shù)據(jù)訪問都要經(jīng)過服務(wù)器這一瓶頸。BT協(xié)議的基礎(chǔ)結(jié)構(gòu)為P2P,即Peer to Peer。P2P可以利用每個節(jié)點的資源,構(gòu)建自組網(wǎng)絡(luò),網(wǎng)絡(luò)結(jié)點之間的關(guān)系屬于對等的,實現(xiàn)了不需要通過服務(wù)器就可以傳送文件。
3 Java語言的線程模型
Java語言的特點是從最底層開始支持線程,標(biāo)準(zhǔn)的Java類允許在一個給定的應(yīng)用程序中有多個線程調(diào)用同一方法,而線程彼此之間互不干擾,Java語言的這些特點為多線程應(yīng)用程序的設(shè)計奠定了基礎(chǔ)。在Java中是由java.lang.Thread類進行定義和描述的。程序中的線程都是Thread類的實例。因此用戶可以通過創(chuàng)建Thread的實例或定義并創(chuàng)建Thread子類的實例建立和控制自己的線程。
當(dāng)一個Java程序運行時,至少會生成一個線程,該線程由main()方法開始的,不同的線程是無法自動啟動的,必須通過其他線程來調(diào)用。一個線程, 同進程一樣,也有從創(chuàng)建、運行到消亡的過程,因此每個線程都具有創(chuàng)建、就緒、運行、死亡四種狀態(tài)。
Java語言是目前最為流行的編程語言,有非常廣泛的應(yīng)用。Java語言的多線程編程技術(shù)可以充分利用到下載程序中,對下載任務(wù)進行分割,從而實現(xiàn)多項任務(wù)并發(fā)運行。
4 Java線程的基本結(jié)構(gòu)與使用方法
4.1 線程的創(chuàng)建、啟動
Java語言線程的創(chuàng)建有兩種方法:
第一種方法是通過繼承Thread類,即將一個類聲明為Thread類的子類,重寫run()方法:
Class ThreadExam extends Thread {public void run(){}}
第二種方法是實現(xiàn)Runnable接口創(chuàng)建線程:
Thread t1 = new Thread(new Runnable(){public void run(){}})
新建的線程不會自動運行,必須調(diào)用線程的start()方式執(zhí)行。該方法的調(diào)用把嵌入在線程中的虛擬CPU置為可運行狀態(tài),意味著它可以被調(diào)度運行,但這并不意味著線程會立即運行。建議在創(chuàng)建線程的時候,使用實現(xiàn)Runnable接口的方式更加靈活。
4.2 多線程下載算法
tP= q(ts+tt)? ? ? ? ? ? ? ? ? ? ? (1)
在公式(1)中,tP代表的是鎖外消耗時長,其占比重為q;ts為鎖內(nèi)消耗時長,tt為解及加鎖消耗時長。如果q是整數(shù)的時候,就代表第一次申請才會形成鎖競爭;如果q是小數(shù)的時候,就會產(chǎn)生重復(fù)鎖競爭。下面公式(2)、(3)、(4)運算公式為運算的并行下載時間:
若q≤h-1,則t(n)=(n+q)(ts+tt)? ? ? ? ? ? ? ? ? ? ? ? ? ? (2)
若q>h-1,則t(n)=(k(q-h+1)+b+q)(ts+tt)? ? ? ? ? (3)
在上面的公式中,N代表的是文件塊數(shù)目,h代表的是線程數(shù)目,k表示的是[nh]比值,p表示的是機器處理核數(shù),fk=ts/tt表示的是鎖粒度。
4.3 線程同步
那些需要共享對象和數(shù)據(jù)的多個線程,必須互相了解對方的狀態(tài)以及活動。不同的線程在同一時間內(nèi)不能存取同一數(shù)據(jù),否則程序就可能出錯。因此,對于這些并發(fā)執(zhí)行卻又共享數(shù)據(jù)的線程,必須采取某些方法對它們進行同步管理。
在Java中,想要實現(xiàn)線程同步,需要基于synchronized關(guān)鍵詞,在利用該方法使用線程之前,其資源是獨享的狀態(tài),其他的線程都處在阻塞的情況。如果這一方法執(zhí)行完成后,其他的線程才能夠使用這一方法。如果只是單純同步某一段代碼,可以采用synchronized的方式。同步程序發(fā)生異常情況的時候,就會發(fā)生饑餓或是死鎖的情況。
5 結(jié)束語
綜上所述,目前,我們在日常生產(chǎn)生活中比較常用的一種下載方案為多線程下載技術(shù),該技術(shù)具有非常顯著的多線程優(yōu)勢,可以利用多個線程同時進行下載,每一個線程只負(fù)責(zé)下載其中一部分,大大提升了下載效率。但是并不是線程越多性能越好,當(dāng)線程超過一定數(shù)量時,線程的調(diào)度的開銷會很大,反而會讓性能降低,因此要適當(dāng)使用多線程,不能濫用。合理利用java斷點續(xù)傳功能,例如突然電腦關(guān)機了,當(dāng)再開機時已經(jīng)下載到一半的文件不需要重新開始,而是接著剛才的位置繼續(xù)下載,既可以節(jié)省網(wǎng)絡(luò)流量和節(jié)省用戶時間,又給用戶良好的使用體驗。
參考文獻:
[1] 耿永利.基于Java的網(wǎng)絡(luò)管理系統(tǒng)開發(fā)與管理[J].漯河職業(yè)技術(shù)學(xué)院學(xué)報,2015(2):34-35.
[2] 姚斌.基于JAVA的多線程下載器的設(shè)計[J].信息與電腦:理論版,2014(7):28-29.
[3] 劉引濤.基于Java的多線程下載工具研究與實現(xiàn)[J].現(xiàn)代電子技術(shù),2012(8):11-14.
[4] 晏春海,田蔚風(fēng),王俊璞,等.多線程技術(shù)在分時串口通信中的應(yīng)用[J].儀表技術(shù)與傳感器,2004(5).
[5] 任雙君,周旭,任勇毛,等.基于HTML5的瀏覽器端多線程下載技術(shù)[J].計算機系統(tǒng)應(yīng)用,2017(11).
[6] 闞能琪.VC++串口通信中多線程技術(shù)的應(yīng)用研究[J].西華大學(xué)學(xué)報:自然科學(xué)版,2005(4).
【通聯(lián)編輯:唐一東】