java_多線程下載

原理:

多線程下載,故名思意,就是開啓多個線程去下載文件,每個線程負責一部分。

實現有兩種方式:

1、多個線程同時下載同時對同一個文件進行寫的操作,也就是說,獲取了文件的總長度後在本地生成一個大小一致的文件,然後每個線程分別對這個文件進行邊下載邊寫。

例如:一個文件總大小是6M,分3個線程去下載,那麼本地也先生成一個大小爲6M的文件,然後3個線程一邊下載一邊的對文件進行寫,不同的是,線程1從0的位置開始寫,線程2從2*1024*1024的位置開始寫,線程3是從4*1024*1024的位置開始寫!全部線程下載完畢後,文件也就下載完畢了!

2、還是和第一種方式一樣,分段下載。還是上面那個例子,3個線程分別生成一個文件(這個文件不需要事先指定大小),然後下載完後拼接成一個文件,就這麼簡單。

兩種方式,都需要搞清楚的是:每個線程從哪裏開始讀?這點要清楚,如果每一個都從開始的位置讀的話,那就掛了。還有一點就是,下載的時候,不是第一個線程要跳到指定位置開始下載,不然全部下載回來的都是第一段,有毛用?

兩種方式的比較,第一種其實是比較方便的,只需要注意每個線程從哪裏開始寫,寫,寫。就可以了。第二種,代碼量多一點,然後還有一個難點是:最後一步合併文件,合併文件本身沒什麼難度,難的是什麼時候合併?只有所有的線程都下載完畢的時候才合併,不然就瞎掰了!哈哈


下面來看代碼,純java的代碼!

本demo不怎麼具備實用性!(因爲沒監聽下載完畢的動作,給個思路,可以給每個線程下載完畢的時候加個回調)

先來看看單線程下載:

這裏說明一下,line200-212是最初的方式,下載全部。line214-233是另一種方式,也就是接下來我們要做的,下載指定的段。這裏當然是下載文件從頭到尾了!


下面來看下載的線程的代碼:

代碼註釋也可以看清楚了,這裏不再解釋;


最終的下載代碼,分段下載


這裏雖然聯網,只是獲取文件的總大小,不進行下載,獲取總大小後,計算出每一段的大小。

然後分割。

這裏看每個線程需要的4個參數,第一個地址,第二個是線程ID,這兩個都沒什麼好解釋的了,然後第三個,開始位置,開始位置我這裏直接 * i  因爲 i=0 的時候也對嘛,直接從0(文件頭部)開始下載,最後一個參數,這裏就直接 * i+1 咯,差不多是這樣,我這裏有個判斷,如果是最後一個線程,那麼就直接給0(因爲我下載線程那裏做了判斷,如果結尾是0的話就直接下載到文件尾部),這裏也可以傳文件的總大小,也是對的,但就不能不判斷,直接傳 section * (i+1) 因爲大家都知道,不管long還是int,當不整除的時候,是會丟的。例如,一個文件大小爲10,分3個線程下載,如果不判斷的話,分別下載0-3,3-6,6-9,自己拿着手指頭數一數,你總共下載了9,而總大小是10,你說對不對?你去打開一下這樣的文件,看能不能打開?(前提不要是文本文件,文本文件估計可以打開,哈哈!)


最後一步,合併文件:



好了,先到這裏,後續再對這個進行升級。


線程篇:

Java_線程-Thread

Java_線程—經典的例子:售票

Java_線程—經典的例子:生產者和消費者


java_多線程下載


發佈了38 篇原創文章 · 獲贊 25 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章