Java簡單多執行緒斷點下載
使用多執行緒下載檔案可以更快完成檔案的下載,多執行緒下載檔案之所以快,是因為其搶佔的伺服器資源多。如:假設伺服器同時最多服務100個使用者,在伺服器中一條執行緒對應一個使用者,100條執行緒在計算機中並非併發執行,而是由CPU劃分時間片輪流執行,如果A應用使用了99條執行緒下載檔案,那麼相當於佔用了99個使用者的資源,假設一秒內CPU分配給每條執行緒的平均執行時間是10ms,A應用在伺服器中一秒內就得到了990ms的執行時間,而其他應用在一秒內只有10ms的執行時間。就如同一個水龍頭,每秒出水量相等的情況下,放990毫秒的水肯定比放10毫秒的水要多。
- XML/HTML 程式碼複製內容到剪貼簿
- package cn.mzba.download;
- import java.io.File;
- import java.io.InputStream;
- import java.io.RandomAccessFile;
- import java.net.HttpURLConnection;
- import java.net.URL;
- public class MulThreadDownloader {
- /**
- * 1、首先獲取網路上的內容,然後獲取檔案的長度,標題。 然後在本地上生成一個同樣大小並且同名的檔案。 2、執行執行緒
- * 3、執行緒首先定義一個隨機輸入流,用來下載檔案同步寫入本地檔案 設定Range從指定的開始位置-結束位置下載檔案。
- * 4、獲取伺服器返回的輸入流寫入檔案。
- *
- */
- public static void main(String[] args) throws Exception {
- String path = "http://www.wo...56c.jpg";
- new MulThreadDownloader().download(path, 3);
- System.in.read();
- }
- public void download(String path, int threadsize) throws Exception {
- URL url = new URL(path);
- HttpURLConnection conn = (HttpURLConnection) url.openConnection();
- conn.setRequestMethod("GET");
- conn.setConnectTimeout(5 * 1000);
- int length = conn.getContentLength(); // 獲取檔案長度
- File localfile = new File(getFileName(path));
- RandomAccessFile file = new RandomAccessFile(localfile, "rwd");
- file.setLength(length);
- file.close();
- // 計算每條執行緒下載的資料長度
- int block = length % threadsize == 0 ? length / threadsize : length
- / threadsize + 1;
- for (int i = 0; i < threadsize; i++) {
- new DownLoadThread(i, url, block, localfile).start();
- }
- }
- private final class DownLoadThread extends Thread {
- private int threadid;
- private URL url;
- private int block;
- private File localfile;
- public DownLoadThread(int threadid, URL url, int block, File localfile) {
- this.threadid = threadid;
- this.block = block;
- this.url = url;
- this.localfile = localfile;
- }
- @Override
- public void run() {
- int startposition = threadid * block; // 從網路檔案的什麼位置開始下載資料
- int endposition = startposition + block - 1; // 下載到檔案的什麼位置結束
- RandomAccessFile file;
- try {
- file = new RandomAccessFile(localfile, "rwd");
- file.seek(startposition);
- HttpURLConnection conn = (HttpURLConnection) url
- .openConnection();
- conn.setRequestMethod("GET");
- conn.setConnectTimeout(5 * 1000);
- conn.setRequestProperty("Range", "bytes=" + startposition + "-"
- + endposition);
- InputStream is = conn.getInputStream();
- byte[] buffer = new byte[1024];
- int len = 0;
- while ((len = is.read(buffer)) != -1) {
- file.write(buffer, 0, len);
- }
- is.close();
- file.close();
- System.out.println("執行緒id" + threadid + "已經下載完成");
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- super.run();
- }
- }
- public static String getFileName(String path) {
- return path.substring(path.lastIndexOf("/") + 1);
- }
- }
本文轉自06peng 51CTO部落格,原文連結:http://blog.51cto.com/06peng/962470,如需轉載請自行聯絡原作者
相關文章
- 多執行緒斷點下載原理執行緒斷點
- Android 多執行緒下載,斷點續傳,執行緒池Android執行緒斷點
- Android多執行緒+單執行緒+斷點續傳+進度條顯示下載Android執行緒斷點
- 簡易多執行緒下載執行緒
- Java多執行緒下載分析Java執行緒
- Java多執行緒下載的例子。Java執行緒
- Java多執行緒下載器FileDownloader(支援斷點續傳、代理等功能)Java執行緒斷點
- Java多執行緒就是這麼簡單Java執行緒
- JAVA多執行緒下載的實現Java執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒
- java多執行緒 wait() notify()簡單使用Java執行緒AI
- Greendao多執行緒下載執行緒
- android典型程式碼系列(二十)------多執行緒下載、斷點續傳Android執行緒斷點
- Java多執行緒/併發08、中斷執行緒 interrupt()Java執行緒
- 多執行緒-執行緒控制之中斷執行緒執行緒
- 多執行緒下的下載原理執行緒
- Java執行緒:執行緒中斷Java執行緒
- 多執行緒下載檔案執行緒
- ftp多執行緒下載工具FTP執行緒
- Java多執行緒檔案分片下載實現Java執行緒
- IDEA多執行緒下空指標斷點除錯Idea執行緒指標斷點除錯
- JAVA重點類 多執行緒Java執行緒
- 多執行緒下載工具 NeatDownloadManager下載執行緒
- 多執行緒下的單例執行緒單例
- Java多執行緒——執行緒Java執行緒
- 利用HTTP協議實現檔案下載的多執行緒斷點續傳HTTP協議執行緒斷點
- Java多執行緒17:中斷機制Java執行緒
- Golang多執行緒簡單鬥地主Golang執行緒
- wxWidgets簡單的多執行緒執行緒
- 多執行緒 -- 初學簡單例子執行緒單例
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- android多執行緒斷點續傳薦Android執行緒斷點
- 多執行緒下載原理解析執行緒
- java多執行緒那點事兒Java執行緒
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒——執行緒池Java執行緒
- JAVA_多執行緒_單例模式Java執行緒單例模式
- 多執行緒Demo學習(執行緒的同步,簡單的執行緒通訊)執行緒