Java単純マルチスレッドブレークポイントダウンロード


マルチスレッドダウンロードファイルを使用すると、ファイルのダウンロードがより速く完了します.マルチスレッドダウンロードファイルが速いのは、サーバリソースが多いためです.例えば、サーバーが同時に最大100人のユーザーにサービスすると仮定し、サーバーの中の1つのスレッドは1人のユーザーに対応し、100本のスレッドはコンピュータの中で同時実行ではなく、CPUがタイムスライスを分けて交代で実行し、Aアプリケーションが99本のスレッドを使ってファイルをダウンロードした場合、99人のユーザーの資源を占有したことに相当する.1秒以内にCPUが各スレッドに割り当てる平均実行時間が10 msであると仮定すると,Aアプリケーションはサーバにおいて1秒で990 msの実行時間を得,他のアプリケーションは1秒で10 msの実行時間しか得られない.蛇口のように、毎秒の出水量が等しい場合、990ミリ秒の水は10ミリ秒の水より多いに違いない.
 

  
  
  
  
  1. XML/HTML   
  2.       
  3. package cn.mzba.download;        
  4.         
  5. import java.io.File;        
  6. import java.io.InputStream;        
  7. import java.io.RandomAccessFile;        
  8. import java.net.HttpURLConnection;        
  9. import java.net.URL;        
  10.         
  11. public class MulThreadDownloader {        
  12.         
  13.     /**        
  14.      * 1、 , , 。  。 2、         
  15.      * 3、 ,   Range - 。        
  16.      * 4、 。        
  17.      *         
  18.      */        
  19.     public static void main(String[] args) throws Exception {        
  20.         String path = "http://www.wo...56c.jpg";        
  21.         new MulThreadDownloader().download(path, 3);        
  22.         System.in.read();        
  23.     }        
  24.         
  25.     public void download(String path, int threadsize) throws Exception {        
  26.         URL url = new URL(path);        
  27.         HttpURLConnection conn = (HttpURLConnection) url.openConnection();        
  28.         conn.setRequestMethod("GET");        
  29.         conn.setConnectTimeout(5 * 1000);        
  30.         int length = conn.getContentLength(); //          
  31.         File localfile = new File(getFileName(path));        
  32.         RandomAccessFile file = new RandomAccessFile(localfile, "rwd");        
  33.         file.setLength(length);        
  34.         file.close();        
  35.         //          
  36.         int block = length % threadsize == 0 ? length / threadsize : length        
  37.                 / threadsize + 1;        
  38.         for (int i = 0; i < threadsize; i++) {        
  39.             new DownLoadThread(i, url, block, localfile).start();        
  40.         }        
  41.     }        
  42.         
  43.     private final class DownLoadThread extends Thread {        
  44.         
  45.         private int threadid;        
  46.         private URL url;        
  47.         private int block;        
  48.         private File localfile;        
  49.         
  50.         public DownLoadThread(int threadid, URL url, int block, File localfile) {        
  51.             this.threadid = threadid;        
  52.             this.block = block;        
  53.             this.url = url;        
  54.             this.localfile = localfile;        
  55.         }        
  56.         
  57.         @Override        
  58.         public void run() {        
  59.             int startposition = threadid * block; //          
  60.             int endposition = startposition + block - 1; //          
  61.             RandomAccessFile file;        
  62.             try {        
  63.                 file = new RandomAccessFile(localfile, "rwd");        
  64.                 file.seek(startposition);        
  65.                 HttpURLConnection conn = (HttpURLConnection) url        
  66.                         .openConnection();        
  67.                 conn.setRequestMethod("GET");        
  68.                 conn.setConnectTimeout(5 * 1000);        
  69.                 conn.setRequestProperty("Range", "bytes=" + startposition + "-"        
  70.                         + endposition);        
  71.                 InputStream is = conn.getInputStream();        
  72.                 byte[] buffer = new byte[1024];        
  73.                 int len = 0;        
  74.                 while ((len = is.read(buffer)) != -1) {        
  75.                     file.write(buffer, 0, len);        
  76.                 }        
  77.                 is.close();        
  78.                 file.close();        
  79.                 System.out.println(" id" + threadid + " ");        
  80.             } catch (Exception e) {        
  81.                 // TODO Auto-generated catch block        
  82.                 e.printStackTrace();        
  83.             }        
  84.         
  85.             super.run();        
  86.         }        
  87.         
  88.     }        
  89.         
  90.     public static String getFileName(String path) {        
  91.         return path.substring(path.lastIndexOf("/") + 1);        
  92.     }        
  93. }