El principio de descargar el punto de ruptura de múltiples subprocesos Java se muestra en la figura:
El código es el siguiente:
import java.io.bufferedReader; import java.io.file; import java.io.fileInputStream; import java.io.inputstreamreader; import java.io.randomaccessfile; import java.net.httpurlconnection; import java.net.url; clase pública MutilethreadDownload { / *** Número de hilos* / private static int threadCount = 3; / *** Tamaño de cada bloque de descarga*/ Private static long Blocksize; / *** Número de hilos en ejecución*/ private static int runningthreadCount; /** * @param args * @throws Exception */public static void main (string [] args) lanza la excepción {// ruta del archivo del servidor string ruta = "http://192.168.1.100:8080/ff.exe"; Url url = nueva url (ruta); Httpurlconnection conn = (httpurlconnection) url.openconnection (); Conn.setRequestMethod ("Get"); Conn.SetConnectTimeOut (5000); int código = conn.getResponseCode (); if (code == 200) {long size = conn.getContentLength (); // Obtenga el tamaño del archivo devuelto por el servidor System.out.println ("Tamaño del archivo del servidor:" + tamaño); blockSize = size / threadcount; // 1. Primero cree un archivo en blanco con el mismo tamaño que el servidor localmente. Archivo archivo = nuevo archivo ("temp.exe"); RandomAccessFile RAF = new RandomAccessFile (archivo, "RW"); raf.setLength (tamaño); // 2. Abra varios hilos infantiles para descargar los recursos correspondientes por separado. RunnthreadCount = ThreadCount; for (int i = 1; i <= threadcount; i ++) {long startIndex = (i - 1) * blockSize; Long EndIndex = I * BlockSize - 1; if (i == ThreadCount) {// El último hilo endindex = size - 1; } System.out.println ("Start Thread:" + i + "Ubicación de descarga:" + startIndex + "~" + endindex); nuevo DownloadThread (Path, I, StartIndex, EndIndex) .Start (); }} conn.disconnect (); } clase privada de clase estática DownloadThread extiende el hilo {private int threadid; Private Long StartIndex; Endindex largo privado; ruta de cadena privada; Public downloadthread (string ruta, int threadid, long startIndex, long endindex) {this.path = rath; this.threadID = threadid; this.startIndex = startIndex; this.endIndex = EndIndex; } @Override public void run () {try {// El tamaño total del hilo actual descarga int total = 0; Archivo posicionFile = nuevo archivo (threadid + ".txt"); Url url = nueva url (ruta); Httpurlconnection conn = (httpurlconnection) url .openconnection (); Conn.setRequestMethod ("Get"); // Luego continúe descargando datos de la ubicación anterior if (posicionFile.Exists () && positionFile.length ()> 0) {// Determinar si hay un registro FileInputStream FIS = new FileInputStream (PositionFile); BufferedReader BR = New BufferedReader (nuevo InputStreamReader (FIS)); // Obtener el tamaño total del hilo actual LastTotalStr = br.readline (); int LastTotal = Integer.ValueOf (LastTotalStr); System.out.println ("último hilo" + threadid + "tamaño total de descarga:" + lastTotal); startIndex += LastTotal; Total += LastTotal; // Agregue el tamaño total de la última descarga. fis.close (); } conn.setRequestProperty ("rango", "bytes =" + startIndex + "-" + endindex); Conn.SetConnectTimeOut (5000); int código = conn.getResponseCode (); System.out.println ("Code =" + Code); InputStream es = conn.getInputStream (); Archivo archivo = nuevo archivo ("temp.exe"); RandomAccessFile RAF = new RandomAccessFile (archivo, "RW"); // Especifica dónde comienza a escribir el archivo. raf.seek (startIndex); System.out.println ("th" + threadid + "hilos: la posición de inicio de escribir el archivo:" + string.valueOf (startIndex)); int len = 0; byte [] buffer = new Byte [512]; while ((len = is.read (buffer))! = -1) {randomAccessFile rf = new RandomAccessFile (PositionFile, "RWD"); raf.write (buffer, 0, len); total += len; rf.Write (String.ValueOf (Total) .getBytes ()); rf.close (); } is.close (); raf.close (); } catch (Exception e) {E.PrintStackTrace (); } Finalmente {// El archivo de registro se puede eliminar después de que se hayan descargado todos los hilos. sincronizado (mutilethreaddownload.class) {system.out.println ("hilo" + threadid + "descargado"); RunningTreadCount--; if (RunnthreadCount <1) {System.out.println ("Todos los hilos están terminados de funcionar. Eliminar archivos para un registro temporal"); for (int i = 1; i <= threadcount; i ++) {archivo f = nuevo archivo (i+".txt"); System.out.println (F.Delete ()); }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} Ial }}}}}}}}}}}}}}}}}}}}}}}}}}}}Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.