原理:
多線程下載,故名思意,就是開啓多個線程去下載文件,每個線程負責一部分。
實現有兩種方式:
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,你說對不對?你去打開一下這樣的文件,看能不能打開?(前提不要是文本文件,文本文件估計可以打開,哈哈!)
最後一步,合併文件:
好了,先到這裏,後續再對這個進行升級。
線程篇: