Ein Thread kann als Download -Kanal verstanden werden. Ein Thread ist ein Datei -Download -Kanal. Mehrere Threads bedeuten, mehrere Download -Kanäle gleichzeitig zu öffnen. Wenn der Server Downloaddienste anbietet, teilt der Benutzer -Downloader die Bandbreite. Wenn die Priorität gleich ist, verteilt der gesamte Server den gesamten Download -Thread gleichmäßig. Es ist nicht schwer zu verstehen. Wenn Sie viele Threads haben, desto schneller laden Sie es herunter.
Die beliebte Download-Software unterstützt Multi-Threading und unterstützt Downloads mit mittlerer Pause. Wenn Sie wieder anfangen, werden Sie nicht von Grund auf neu heruntergeladen.
Die Schritte zur Implementierung der beiden Funktionen sind wie folgt:
(1) Bestimmen Sie bei der Verbindung zur Ressourcendatei zuerst die Größe der Ressourcendatei und erstellen Sie eine temporäre Datei derselben Größe lokal, um die Download -Daten zu speichern.
(2) Bestimmen Sie die für jeden Thread erforderliche Dateigröße basierend auf der Anzahl der Threads
(3) Bestimmen Sie den Download -Speicherort jedes Threads für den Start und den Ende gemäß der Dateigröße und Anzahl der von jedem Thread heruntergeladenen Threads und bestimmen Sie den Start- und Enddownload -Speicherort jedes Threads gemäß der Dateigröße und Anzahl der von jedem Thread heruntergeladenen Threads.
(4) Um die Breakpoint-Download-Funktion zu erkennen, muss der Standort des Downloads Echtzeit jedes Threads zu markieren, um den Fortschritts-Download am Anfang des nächsten Mals zu erleichtern.
Öffnen Sie 3 Thread -Download -Ansichten (das Standard -Download -Verzeichnis ist ein Projekt unter Java):
Der Gesamtimplementierungscode lautet wie folgt (es gibt immer noch viel Raum für die Optimierung, also schauen Sie sich ihn nicht nur an und es ist fertig).
Importieren Sie Java.io.BufferedReader; Import Java.io.file; Import Java.io.fileinputstream; Import Java.io.inputStreamReader; Import Java.io.io.Randomaccessfile; String path = "http://soft3.xzstatic.com/2015/10/hsjj2ghgzh.rar"; public static int threadCount = 0; // deklarieren Sie die Anzahl der Threads Public static void main (String [] args) {try {url url = new URL (Pfad); // Die Verbindung httpurlConnection conn = (httpurlConnection) url.openconnection () erhalten; // Definieren Sie den Dateinamen, indem Sie die Verbindungszeichenfolge [] str = path.split ("/") erhalten; String Dateiname = Str [5]; // Erhalten Sie die Download -Dateigröße int filelength = conn.getContentLength (); System.out.println (Dateiname); // Erstellen Sie eine zufällig geschriebene Datei, die mit der Servergröße lokal randomAccessfile übereinstimmt. System.out.println (filelength); // testen raf.setLength (filelength); // benutzerdefinierte Thread Count ThreadCount = 3; // Berechnen Sie die Größe der Daten, die von jedem Thread int blockSize = filelength / threadCount heruntergeladen wurden; // Thread Download für (int threadId = 1; ThreadID <= threadCount; ThreadID ++) {// CORE -Code, Definieren Sie den Download -Speicherort, an dem jeder Thread startet und endet. = Filelength; } neuer Thread (neuer DownloadLoadthread (ThreadID, Startpos, Endpos, Pfad)) .Start (); }} catch (Ausnahme e) {e.printstacktrace (); }} // Implementieren Sie den Download -Thread statische Klasse downloadLoadthread implements runnable {private int threadID; private int startpos; private Int -Endpos; privater Stringweg; public downloadLoadThread (int threadID, int startpos, int Endpos, String -Pfad) {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 ("/"); String Dateiname = Str [5]; HttpurlConnection conn = (httpurlConnection) url .openconnection (); // Setzen Sie die Methode der URL -Anforderung (finden Sie in der API für Details) Conn.SetRequestMethod ("get"); // 500 ms als Zeitüberschreitungswert Conn.SetReadTimeout (5000) festlegen; Datei Datei = new Datei (ThreadID + ".txt"); if (file.exists () && file.length ()> 0) {bufferedReader BR = New BufferedReader (neuer InputStreamReader (neuer FileInputStream (Datei)); String SavestartPos = Br.readline (); if (SavestartPos! }} // achten Sie auf das Format in doppelten Zitaten und können keine Leerzeichen (wie andere Zeichen) enthalten, ansonsten wird 416 gemeldet. Conn.SetRequestProperty ("Bereich", "bytes =" + startpos + "-" + endpos); RandomAccessFile RAF = New AccessFile (Dateiname, "RWD"); // Speichern Sie die Zufallsschreibdatei in die Download -Datei Raf.seek (startpos); // Setzen Sie den Ort, um das Download -System zu starten. InputStream ist = conn.getInputStream (); Byte [] B = neues Byte [1024 * 1024 * 10]; int len = -1; int newpos = startpos; while ((len = is.read (b))! // Speichern Sie das Download -Tag in den angegebenen Dokument String savApoint = string.ValueOf (NewPos += len); rr.write (savApoint.getBytes ()); rr.close (); } is.close (); raf.close (); System.out.println ("komplett herunterladen"); } catch (Ausnahme e) {e.printstacktrace (); }}}}Anmerkungen:
(1) Verstehen Sie die Berechnungsmethode der Start- und Endpositionen jedes Thread -Downloads (ohne den letzten Thread, starten Sie mit 0)
Startposition = (Anzahl der Threads - 1) * Die Länge (Größe) der Datei, die von jedem Thread heruntergeladen werden soll
Endposition = (Anzahl der Threads * Dateigröße, die von jedem Thread heruntergeladen wird) -1
(2) Die vom letzten Thread zugewiesene Download -Startposition ist die Endposition des vorherigen Threads, und die Endposition ist die Dateilänge.
Daher ist die vom letzte Thread heruntergeladene Dateilänge im Allgemeinen nicht mit dem vorherigen Thread überein
.
(4) ein Fehler, den ich in der Implementierung Conn.SetRequestProperty ("Bereich", "Bytes ="+startpos+"-"+Endpos) gemacht habe; Achten Sie darauf, dass die Zitate nicht unbedingt zusätzliche Räume und andere Zeichen haben. Ich habe nur einen Platz in den Zitaten, aber die Fehlerpositionierung war immer ein Eingabestream -Fehler, und es ist sehr schmerzhaft, die falschen zu finden.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.