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