Un fil peut être compris comme une chaîne de téléchargement. Un thread est une chaîne de téléchargement de fichiers. Plusieurs threads signifie ouvrir plusieurs canaux de téléchargement en même temps. Lorsque le serveur fournit des services de téléchargement, le téléchargeur d'utilisateurs partage la bande passante. Lorsque la priorité est la même, le serveur total allouera uniformément le fil de téléchargement total. Ce n'est pas difficile à comprendre. Si vous avez beaucoup de fils, plus vous le téléchargez rapidement.
Le logiciel de téléchargement populaire prend en charge le multi-threading et prend en charge les téléchargements de pause à mi-temps. Lorsque vous recommencez, vous ne téléchargerez pas à partir de zéro.
Les étapes pour implémenter les deux fonctions sont les suivantes:
(1) Lors de la connexion au fichier de ressources de téléchargement, déterminez d'abord la taille du fichier de ressources et créez un fichier temporaire de la même taille localement pour stocker les données de téléchargement.
(2) Déterminer la taille du fichier requise pour chaque thread en fonction du nombre de threads
(3) Déterminez l'emplacement de téléchargement de démarrage et de fin de chaque thread en fonction de la taille du fichier et du nombre de threads téléchargés par chaque thread, et déterminez l'emplacement de téléchargement de démarrage et de fin de chaque thread en fonction de la taille du fichier et du nombre de threads téléchargés par chaque thread.
(4) Afin de réaliser la fonction de téléchargement de points d'arrêt, il est nécessaire de marquer l'emplacement du téléchargement en temps réel de chaque fil pour faciliter le téléchargement de progrès au début la prochaine fois.
Open 3 Vues de téléchargement de threads (le répertoire de téléchargement par défaut est un projet sous Java):
Le code de mise en œuvre global est le suivant (il y a encore beaucoup de place pour l'optimisation, alors ne le regardez pas et c'est fait)
Importer java.io.bufferedReader; import java.io.file; import java.io.fileInputStream; import java.io.inputStreamReader; import java.io.randomaccessfile; import java.net.httpurlconnection; Importer java.net.url; public class download toload {// discoul String path = "http://soft3.xzstatic.com/2015/10/hsjj2ghgzh.rar"; public static int threadcount = 0; // Déclare le nombre de threads public static void main (String [] args) {try {url url = new url (path); // Obtenez la connexion httpurlConnection Conn = (httpurlConnection) url.openconnection (); // Définissez le nom du fichier en obtenant la chaîne de connexion [] str = path.split ("/"); String filename = str [5]; // Obtenez la taille du fichier de téléchargement int fileLength = Conn.getContentLength (); System.out.println (nom de fichier); // Créez un fichier écrit au hasard qui est cohérent avec la taille du serveur localement randomaccessfile raf = new randomaccessfile (nom de fichier, "rwd"); System.out.println (FileLength); // test raf.setLength (fileLength); // Count de thread personnalisé ThreadCount = 3; // Calculez la taille des données téléchargées par chaque thread int blockSize = fileLength / ThreadCount; // Démarrer le thread Download pour (int threadid = 1; threadid <= threadCount; ThreadId ++) {// CODE CODE, Définissez l'emplacement de téléchargement à laquelle chaque thread démarre et se termine est int startpos = (ThreadID - 1) * BlockSize; // l'emplacement à laquelle le téléchargement démarre Int endpos = (ThreadId * BlockSize) - 1; // l'emplacement à laquelle le téléchargement se termine (Not Inclure le dernier morceau) If (ThreadCount ==) = fileLength; } Nouveau thread (nouveau téléchargement Téléchargement (ThreadId, startpos, endpos, chemin)) .Start (); }} catch (exception e) {e.printStackTrace (); }} // Implémentation du thread de téléchargement STATIC CLASSE DownloadLoadThread Implements Runnable {private int threadID; private int startpos; EndPos int privé; Path de chaîne privé; 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 ("/"); String filename = str [5]; HttpurlConnection conn = (httpurlconnection) url .openconnection (); // Définissez la méthode de la demande d'URL (reportez-vous à l'API pour plus de détails) Conn.SetRequestMethod ("Get"); // Définir 500 ms comme valeur de délai d'expiration Conn.SetReadTimeout (5000); Fichier file = nouveau fichier (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); }} // prêtez attention au format en double guillemets et ne peut pas contenir d'espaces (comme d'autres caractères), sinon 416 est signalé. Conn.SetRequestProperty ("Range", "Bytes =" + StartPos + "-" + endPOS); RandomAccessFile RAF = new RandomAccessFile (FileName, "RWD"); // Stockage du fichier d'écriture aléatoire dans le fichier de téléchargement raf.seek (startPos); // Définissez l'emplacement pour démarrer le système de téléchargement.out.println ("thread" + threadID + ":" + startpos + "~~" + endPOS); InputStream est = conn.getInputStream (); octet [] b = nouveau octet [1024 * 1024 * 10]; int len = -1; int newpos = startPOS; while ((len = is.read (b))! = -1) {randomaccessfile rr = new randomaccessfile (fichier, "rwd"); // le fichier stockant la balise de téléchargement raf.write (b, 0, len); // Enregistrez la balise de téléchargement dans le document spécifié String Savapoint = String.ValueOf (newPos + = Len); rr.write (savapoint.getBytes ()); rr.close (); } is.close (); raf.close (); System.out.println ("Télécharger complet"); } catch (exception e) {e.printStackTrace (); }}}}Notes:
(1) Comprendre la méthode de calcul des positions de début et de fin de chaque téléchargement de thread (sans compter le dernier thread, commencez à partir de 0)
Position de démarrage = (nombre de threads - 1) * la longueur (taille) du fichier à télécharger par chaque thread
Position finale = (nombre de threads * taille de fichier téléchargée par chaque thread) -1
(2) La position de démarrage de téléchargement attribuée par le dernier thread est la position finale du thread précédent, et la position finale est la longueur du fichier.
Par conséquent, la longueur de fichier téléchargée par le dernier thread ne sera généralement pas la même que le thread précédent
(3) Le chemin de téléchargement de cette démonstration est le répertoire où le projet Java est situé par défaut, et le répertoire ne peut pas contenir de fichiers avec le même nom que le fichier téléchargé, sinon le programme rapportera une erreur de demande réseau 416.
(4) une erreur que j'ai commise dans l'implémentation Conn.SetRequestProperty ("Range", "bytes =" + startPos + "-" + endPos); Assurez-vous de noter que les citations n'ont pas nécessairement des espaces supplémentaires et d'autres caractères. J'ai juste un espace dans les citations, mais le positionnement de l'erreur a toujours été une erreur intraStream, et il est très douloureux de trouver les mauvais.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.