多執行緒下的下載原理
*1.本地建立一個大小跟伺服器檔案相同大小的臨時檔案
*2.計算分配幾個執行緒去下載伺服器上的資源,知道每個執行緒下載的位置
*3.開啟多(3)個執行緒,沒個執行緒下載對於位置的檔案
*2.計算分配幾個執行緒去下載伺服器上的資源,知道每個執行緒下載的位置
*3.開啟多(3)個執行緒,沒個執行緒下載對於位置的檔案
*4.如果所有的執行緒,都把自己的資料下載完畢了,伺服器上的資源就被下載到本地
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.RandomAccess;
/**
* 多執行緒下載的測試類
* @author Administrator
*
*/
public class Demo1 {
public static int threadcount = 3;
public static void main(String[] args) throws Exception{
//1.連線伺服器,獲取一個檔案獲取檔案的長度,在本地建立一個大小跟伺服器檔案一樣大的臨時檔案
String path = "http://192.168.1.100:8080/360.exe";
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
int code = conn.getResponseCode();
if(code == 200){
//伺服器返回的資料長度,實際上就是檔案的長度
int length = conn.getContentLength();
System.out.println("檔案總長度:"+length);
//在客戶端本地建立出來的一個大小跟伺服器端檔案一樣大小的臨時檔案
RandomAccessFile raf = new RandomAccessFile("setup.exe","rwd");
//指定建立的這個檔案的長度
raf.setLength(length);
raf.close();
//假設是3個執行緒去下載資源
//平均每一個執行緒下載的檔案的大小
int blockSize = length / threadcount;
for (int threadId = 1; threadId < threadcount; threadId++) {
//第一個執行緒下載的開始位置
int startIndex = (threadId-1)*blockSize;
int endIndex = threadId*blockSize - 1;
if(threadId==threadcount){//最後一個執行緒下載的長度要稍微長一點
endIndex = length;
}
System.out.println("執行緒:" + threadId + "下載:" + startIndex + "-->" + endIndex);
new DownloadThread(endIndex,threadId,startIndex,path).start();
}
}else {
System.out.println("伺服器錯誤");
}
}
/**
* 下載檔案的子執行緒下載對應位置的檔案
* @author Administrator
*
*/
public static class DownloadThread extends Thread{
private int threadId;
private int startIndex;
private int endIndex;
private String path;
/**
* @param path 下載檔案在伺服器上的路徑
* @param threadId 執行緒id
* @param startIndex 執行緒下載的開始位置
* @param endIndex 執行緒下載的結束位置
*/
public DownloadThread(int threadId, int startIndex, int endIndex,String path) {
this.path = path;
this.threadId = threadId;
this.startIndex = startIndex;
this.endIndex = endIndex;
}
public void run() {
try {
URL URL = new URL(path);
HttpURLConnection connection = (HttpURLConnection) URL.openConnection();
connection.setRequestMethod("GET");
//重要:請求伺服器下載部分的檔案指定的位置
connection.setRequestProperty("Range","bytes="+startIndex +"-" + endIndex);
connection.setConnectTimeout(5000);
int code = connection.getResponseCode();//從伺服器請求全部資源,如果產品能夠伺服器請求部分資源,206 ok
System.out.println("code:"+code);
InputStream is = connection.getInputStream();//已經設定了 請求的位置,返回的是當前位置對於的檔案輸入流
RandomAccessFile raf = new RandomAccessFile("setup.exe","rwd");
//隨機寫檔案的時候從哪個位置開始寫
raf.seek(startIndex);//定位檔案
int len = 0;
byte[] buffer = new byte[1024];
while ((len=is.read(buffer))!=-1) {
raf.write(buffer,0,len);
}
is.close();
raf.close();
System.out.println("執行緒:"+threadId+"下載玩完畢");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
相關文章
- 多執行緒下載原理解析執行緒
- 多執行緒斷點下載原理執行緒斷點
- Greendao多執行緒下載執行緒
- 多執行緒下載工具 NeatDownloadManager下載執行緒
- Java多執行緒下載的例子。Java執行緒
- 多執行緒下載檔案執行緒
- Java多執行緒下載分析Java執行緒
- 簡易多執行緒下載執行緒
- ftp多執行緒下載工具FTP執行緒
- JAVA多執行緒下載的實現Java執行緒
- Chrome 開啟多執行緒下載Chrome執行緒
- Android原生下載(下篇)多檔案下載+多執行緒下載Android執行緒
- 多執行緒下的list執行緒
- 實現FTP多執行緒下載 (轉)FTP執行緒
- https多執行緒下載程式碼HTTP執行緒
- Android 多執行緒下載,斷點續傳,執行緒池Android執行緒斷點
- 多執行緒下的單例執行緒單例
- 強推!多執行緒下載工具 NeatDownloadManager執行緒
- Java簡單多執行緒斷點下載Java執行緒斷點
- 多執行緒下載nginx站點目錄下檔案執行緒Nginx
- IOS下使用多執行緒iOS執行緒
- .NET下多執行緒初探執行緒
- Java多執行緒檔案分片下載實現Java執行緒
- flashget 1.6的下載執行緒增加執行緒
- Java多執行緒20:多執行緒下的其他元件之CountDownLatch、Semaphore、ExchangerJava執行緒元件CountDownLatch
- 多執行緒同步的原理執行緒
- 通用的上傳下載(執行緒)執行緒
- 超強Mac多執行緒下載工具 NeatDownloadManager MacMac執行緒
- 網路程式設計基礎,多執行緒下載程式設計執行緒
- Chrome、Edge瀏覽器內建多執行緒下載Chrome瀏覽器執行緒
- C#多執行緒下的調優C#執行緒
- 多執行緒環境下的DateFormat 使用執行緒ORM
- java多執行緒原理Java執行緒
- 圖解:HTTP 範圍請求,助力斷點續傳、多執行緒下載的核心原理圖解HTTP斷點執行緒
- 5招教你實現多執行緒場景下的執行緒安全!執行緒
- 多執行緒下的程式同步(執行緒同步問題總結篇)執行緒
- 用VB編寫非同步多執行緒下載程式 (轉)非同步執行緒
- Android多執行緒+單執行緒+斷點續傳+進度條顯示下載Android執行緒斷點