スレッドはダウンロードチャネルとして理解できます。 1つのスレッドはファイルダウンロードチャネルです。複数のスレッドとは、複数のダウンロードチャネルを同時に開くことを意味します。サーバーがダウンロードサービスを提供すると、ユーザーダウンロード担当者は帯域幅を共有します。優先度が同じ場合、合計サーバーはTotal Downloadスレッドを均等に割り当てます。理解するのは難しくありません。多くのスレッドがある場合は、ダウンロードするのが速くなります。
人気のあるダウンロードソフトウェアは、マルチスレッドをサポートし、中間の一時停止ダウンロードをサポートしています。再び開始すると、ゼロからダウンロードしません。
2つの関数を実装する手順は次のとおりです。
(1)ダウンロードリソースファイルに接続するときは、まずリソースファイルのサイズを決定し、ダウンロードデータを保存するために同じサイズの一時ファイルをローカルで作成します。
(2)スレッドの数に基づいて各スレッドに必要なファイルサイズを決定する
(3)各スレッドでダウンロードされたスレッドのファイルのサイズとスレッドの数に従って各スレッドの開始および終了のダウンロード場所を決定し、各スレッドでダウンロードしたスレッドのファイルサイズとスレッドの数に従って各スレッドの開始および終了のダウンロード場所を決定します。
(4)ブレークポイントのダウンロード機能を実現するには、各スレッドのリアルタイムダウンロードの場所をマークして、次回の最初の進行状況のダウンロードを容易にする必要があります。
3スレッドのダウンロードビューを開きます(デフォルトのダウンロードディレクトリはJavaの下のプロジェクトです):
全体的な実装コードは次のとおりです(まだ最適化の余地がたくさんあるので、それを見てはいけませんが、完了しています)
java.io.bufferedReader;インポートjava.io.file;インポートjava.io.fileinputStream; Import java.io.inputStreamReader; Import java.io.randomaccessfile; Import java.net.net.httpurlconnection;静的な最終文字列PATH = "http://soft3.xzstatic.com/2015/10/hsjj2ghgzh.rar"; public static int threadcount = 0; //スレッドの数を宣言しますpublic static void main(string [] args){try {url url = new url(path); //接続を取得httpurlconnection conn =(httpurlconnection)url.openconnection(); //接続文字列[] str = path.split( "/")を取得してファイル名を定義します。文字列filename = str [5]; //ダウンロードファイルサイズint filelength = conn.getContentLength()を取得します。 System.out.println(filename); //サーバーのサイズと一致するランダムに書かれたファイルを作成します。 System.out.println(filelength); // raf.setlength(filelength); //カスタムスレッドカウントThreadCount = 3; //各スレッドでダウンロードされたデータのサイズを計算しますint blocksize = filelength / threadcount; //(int threadid = 1; threadid <= threadcount; threadid ++)for(int threadid = 1; threadid ++){//コアコード、コアコード、各スレッドが起動して終了するダウンロード場所を定義します。フィルレングス; } new Thread(new downloadloadthread(threadid、startpos、endpos、path)).start(); }} catch(例外e){e.printstacktrace(); }} //ダウンロードスレッドSTARTIC CLASSダウンロードLoadThreadを実装してくださいrunnable {private int threadid;プライベートint startpos;プライベートint endpos;プライベートストリングパス。 public downloadloadThread(int threadid、int startpos、int endpos、string path){super(); this.threadid = threadid; this.startpos = startpos; this.endpos = endpos; this.path = path; } public void run(){try {url url = new url(path); string [] str = path.split( "/");文字列filename = str [5]; httpurlconnection conn =(httpurlconnection)url .openconnection(); // URL要求の方法を設定します(詳細についてはAPIを参照)conn.setRequestMethod( "get"); // 500msをタイムアウト値conn.setreadTimeout(5000)として設定します。ファイルfile = new file(threadid + ".txt"); if(file.exists()&& file.length()> 0){bufferedreader br = new bufferedReader(new inputStreamReader(new FileInputStream(file))); string savestartpos = br.readline(); if(savestartpos!= null && savestartpos.length()> 0){startpos = integer.parseint(savestartpos); }} //二重引用符の形式に注意を払うと、スペース(他の文字など)を含めることはできません。そうでなければ、416が報告されています。 conn.setRequestProperty( "range"、 "bytes =" + startpos + " - " + endpos); RandomAccessFile raf = new RandomAccessFile(filename、 "rwd"); //ランダム書き込みファイルをダウンロードファイルraf.seek(startpos); //場所を設定してダウンロードSystem.out.println( "thread" + threadid + ":" + startpos + "~~" + endpos); inputstream is = conn.getInputStream(); byte [] b = new byte [1024 * 1024 * 10]; int len = -1; int newpos = startpos; while((len = is.read(b))!= -1){randomaccessfile rr = new RandomAccessFile(file、 "rwd"); //ダウンロードタグraf.write(b、0、len)を保存するファイル; //「ダウンロードタグ」を指定されたドキュメントストリングsavapoint = string.valueof(newpos += len)に保存します。 rr.write(savapoint.getBytes()); rr.close(); } is.close(); raf.close(); system.out.println( "completeをダウンロード"); } catch(Exception e){e.printstacktrace(); }}}}注:
(1)各スレッドのダウンロードの開始位置と終了位置の計算方法を理解する(最後のスレッドを含めない、0から開始)
[Positions] =(スレッド数-1) *各スレッドでダウンロードされるファイルの長さ(サイズ)
end position =(スレッドの数 *各スレッドによってダウンロードされたファイルサイズ)-1
(2)最後のスレッドで割り当てられたダウンロード開始位置は、前のスレッドの終了位置であり、エンド位置はファイルの長さです。
したがって、最後のスレッドによってダウンロードされたファイルの長さは、通常、前のスレッドと同じではありません
(3)このデモンストレーションのダウンロードパスは、Javaプロジェクトがデフォルトで配置されているディレクトリであり、ディレクトリにはダウンロードされたファイルと同じ名前のファイルを含めることはできません。そうしないと、プログラムは416ネットワークリクエストエラーを報告します。
(4)実装conn.setRequestProperty( "range"、 "bytes ="+startpos+" - "+endpos)で犯した間違い。引用符には必ずしも余分なスペースや他のキャラクターがあるとは限らないことに注意してください。引用符にはスペースがありますが、エラーポジショニングは常に入力ストリームエラーであり、間違ったエラーを見つけるのは非常に苦痛です。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。