1. 程式人生 > >Thread執行緒系列之多執行緒下載

Thread執行緒系列之多執行緒下載

瞭解了這麼多與執行緒相關的知識,那麼我們也要實戰一下了(在學習本篇知識之前,如果對java中的網路基礎連結不太熟悉的,建議先去學一下java網路程式設計,再來看本文章。)

因為本篇是多執行緒下載的demo,所以就直接附上程式碼,裡面都寫好了註釋,不影響對本篇的學習。

package com.liuqiang.Thread;

import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import 
java.net.URL; public class DownloadFileThread { /** * 多執行緒下載檔案 * * @param args */ // 定義開啟執行緒總數 為3個執行緒 private static final int threadCount = 3; // 下載檔案的url地址 private static final String urlFile = "http://10.135.110.63:8080/BaiduYunGuanjia.exe"; public static void main(String[] args) { new
Thread() { public void run() { try { URL url = new URL(urlFile); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000
); int code = connection.getResponseCode(); if (code == 200) { //(1) 獲取檔案總大小 int fileLength = connection.getContentLength(); System.out.println("檔案總大小" + fileLength); /** * (2) * RandomAccessFile(適用於多執行緒下載與上傳)隨機讀寫檔案物件 * 在客戶端建立一個與伺服器端一模一樣大小的檔案 * 引數一:檔名 * 引數二:可讀可寫 */ RandomAccessFile raf = new RandomAccessFile("BaiduYunGuanjia.exe", "rw"); raf.setLength(fileLength); //(3)計算每個執行緒下載的開始位置與結束位置 int blockSize = fileLength / threadCount; //每個執行緒下載(平均)的大小 for (int i = 0; i < threadCount; i++) { int startIndex = i * blockSize; //每個執行緒下載的開始位置 int endIndex = (i + 1) * blockSize - 1; //每個執行緒下載的結束位置 //特殊情況 最後一個執行緒(最後一個執行緒可能會下載多一些) if (i == threadCount - 1) { //說明是最後一個執行緒 endIndex = fileLength - 1; } //(4)開啟執行緒下載檔案 DownloadThered downloadThered = new DownloadThered(startIndex, endIndex, i); downloadThered.start(); } } } catch (Exception e) { e.printStackTrace(); } } ; }.start(); } /** * 開啟多執行緒 下載 * * @author Administrator */ public static class DownloadThered extends Thread { private int startIndex; private int endIndex; private int threadCount; public DownloadThered(int startIndex, int endIndex, int threadCount) { super(); this.startIndex = startIndex; this.endIndex = endIndex; this.threadCount = threadCount; } @Override public void run() { try { URL url = new URL(urlFile); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); //設定請求頭 告訴伺服器每個執行緒下載的開始位置與結束位置 connection.setRequestProperty("Range", "bytes=" + startIndex + "-" + endIndex); int code = connection.getResponseCode(); //200代表請求全部資源 206代表請求部分資源 if (code == 206) { /** * RandomAccessFile(適用於多執行緒下載與上傳)隨機讀寫檔案物件 * 在客戶端建立一個與伺服器端一模一樣大小的檔案 * 引數一:檔名 * 引數二:可讀可寫 */ RandomAccessFile raf = new RandomAccessFile("BaiduYunGuanjia.exe", "rw"); //定位 也就是設定每個執行緒從檔案的哪個位置開始下載(設定每個執行緒下載的起始位置) raf.seek(startIndex); InputStream inStream = connection.getInputStream(); //網路獲取的資料 //把資料寫到檔案當中 int len = -1; byte[] buffer = new byte[1024]; while ((len = inStream.read(buffer)) != -1) { raf.write(buffer, 0, len); } raf.close(); System.out.println("執行緒" + threadCount + "下載完成了"); } } catch (Exception e) { e.printStackTrace(); } } } }

下一篇 執行緒池詳解