Le principe de téléchargement du point d'arrêt multithread Java est illustré sur la figure:
Le code est le suivant:
Importer java.io.bufferedReader; Importer java.io.file; import java.io.fileInputStream; Importer java.io.inputStreamReader; import java.io.randomaccessfile; import java.net.httpurlconnection; Importer java.net.url; classe publique mutileThreaddownload {/ ** * nombre de threads * / private static int threadcount = 3; / ** * Taille de chaque bloc de téléchargement * / BlockSize long statique privé; / ** * Nombre de threads en cours d'exécution * / private static int runningthreadCount; / ** * @param args * @throws exception * / public static void main (String [] args) lève l'exception {// path du fichier serveur String path = "http://192.168.1.100:8080/ff.exe"; Url url = nouvelle URL (chemin); HttpurlConnection conn = (httpurlconnection) url.openconnection (); Conn.SetRequestMethod ("Get"); Conn.SetConnectTimeout (5000); int code = conn.getResponSECODE (); if (code == 200) {Long Size = Conn.getContentLength (); // Obtenez la taille du fichier renvoyé par le serveur System.out.println ("Taille du fichier du serveur:" + taille); BlockSize = size / threadCount; // 1. Créez d'abord un fichier vide avec la même taille que le serveur localement. File file = new File ("temp.exe"); RandomAccessFile RAF = new RandomAccessFile (fichier, "RW"); raf.setLength (taille); // 2. Ouvrez plusieurs threads enfants pour télécharger séparément les ressources correspondantes. RunningThreadCount = ThreadCount; for (int i = 1; i <= threadCount; i ++) {long startIndex = (i - 1) * blockSize; long endIndex = i * blockSize - 1; if (i == ThreadCount) {// Le dernier thread endIndex = size - 1; } System.out.println ("Start Thread:" + I + "Télécharger l'emplacement:" + startIndex + "~" + endIndex); new DownloadThread (path, i, startIndex, endIndex) .start (); }} conn.disconnect (); } Classe statique privée téléchargement Téléchargement étend Thread {private int threadid; Long StartIndex privé; Private Long Endindex; Path de chaîne privé; Public DownloadThread (String Path, int threadid, long startIndex, long endIndex) {this.path = path; this.threaDID = ThreadID; this.startIndex = startIndex; this.endindex = endIndex; } @Override public void run () {try {// La taille totale du téléchargement de thread actuel int total = 0; Fichier positionfile = nouveau fichier (threadid + ".txt"); Url url = nouvelle URL (chemin); HttpurlConnection conn = (httpurlconnection) url .openconnection (); Conn.SetRequestMethod ("Get"); // Continuez ensuite à télécharger des données à partir de l'emplacement précédent if (PositionFile.exists () && positionfile.length ()> 0) {// Déterminez s'il y a un enregistrement FileInputStream Fis = new FileInputStream (PositionFile); BufferedReader br = new BufferedReader (new inputStreamReader (FIS)); // Obtenez la taille totale du thread actuel LastTotalStr = Br.Readline (); int lastTotal = Integer.ValueOf (LastTotalStr); System.out.println ("Last Thread" + ThreadID + "Taille totale du téléchargement:" + LastTotal); startIndex + = lastTotal; Total + = LastTotal; // Ajouter la taille totale du dernier téléchargement. fis.close (); } conn.setRequestProperty ("range", "bytes =" + startIndex + "-" + endIndex); Conn.SetConnectTimeout (5000); int code = conn.getResponSECODE (); System.out.println ("code =" + code); InputStream est = conn.getInputStream (); File file = new File ("temp.exe"); RandomAccessFile RAF = new RandomAccessFile (fichier, "RW"); // spécifie où le fichier commence à écrire. raf.seek (startIndex); System.out.println ("th" + threadid + "Threads: la position de début de l'écriture du fichier:" + string.valueof (startIndex)); int len = 0; octet [] tampon = nouveau octet [512]; while ((len = is.read (tampon))! = -1) {randomaccessfile rf = new randomaccessfile (positionfile, "rwd"); raf.write (tampon, 0, len); Total + = len; rf.write (string.valueof (total) .getBytes ()); rf.close (); } is.close (); raf.close (); } catch (exception e) {e.printStackTrace (); } Enfin {// Le fichier d'enregistrement peut être supprimé après que tous les threads ont été téléchargés. synchronisé (mutileThreaddownload.class) {System.out.println ("thread" + threadid + "téléchargé"); RunningThreadCount--; if (RunningThreadCount <1) {System.out.println ("Tous les threads ont terminé le fonctionnement. Supprimer les fichiers pour l'enregistrement temporaire"); pour (int i = 1; i <= threadCount; i ++) {fichier f = nouveau fichier (i + ".txt"); System.out.println (f.delete ()); }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, }}}}}}}}}}}}}}}}}}}}}}}}}}}}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.