O princípio do download do ponto de interrupção Java multi-thread é mostrado na figura:
O código é o seguinte:
importar java.io.bufferedReader; importar java.io.file; importar java.io.fileInputStream; importar java.io.inputStreamReader; importar java.io.randomaccessfile; importar java.net.httpurlConnection; importar java.net.url; classe pública MutileThreadDownload { / *** Número de threads* / private static int threadCount = 3; / *** Tamanho de cada bloco de download*/ Private Static Long BlockSize; / *** Número de threads em execução*/ privado estático int runningthreadCount; /** * @param args * @throws Exception */public static void main (string [] args) lança exceção {// caminho do arquivo servidor string string path = "http://192.168.1.100:8080/ff.exe"; Url url = novo url (caminho); HttpurlConnection Conn = (httpurlConnection) url.openconnection (); Conn.SetRequestMethod ("Get"); Conn.SetConnectTimeout (5000); int code = conn.getResponsecode (); if (code == 200) {tamanho longo = conn.getContentLength (); // Obtenha o tamanho do arquivo retornado pelo servidor System.out.println ("Tamanho do arquivo do servidor:" + tamanho); blocksize = size / threadcount; // 1. Primeiro, crie um arquivo em branco com o mesmo tamanho do servidor localmente. Arquivo de arquivo = novo arquivo ("temp.exe"); RAF RAFACESSFILE RAF = novo RandomAccessFile (arquivo, "RW"); Raf.setLength (tamanho); // 2. Abra vários tópicos para o download dos recursos correspondentes separadamente. RunningthreadCount = ThreadCount; for (int i = 1; i <= threadcount; i ++) {long startIndex = (i - 1) * blocksize; long endindex = i * blocksize - 1; if (i == ThreadCount) {// o último thread endIndex = size - 1; } System.out.println ("start thread:" + i + "download localização:" + startIndex + "~" + endindex); new DownloadThread (Path, I, StartIndex, EndIndex) .Start (); }} Conn.Disconnect (); } classe estática privada DownloadThread Extende thread {private int threadId; Private StartIndex privado; Private Long EndIndex; Caminho de cordas privadas; 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 {// O tamanho total do encadeamento atual download int total = 0; FILE POSICEFILE = novo arquivo (ThreadId + ".txt"); Url url = novo url (caminho); HttpurlConnection Conn = (httpurlConnection) url .Openconnection (); Conn.SetRequestMethod ("Get"); // continua fazendo o download dos dados do local anterior se (POSITIONFILE.EXISTS () && POSITIONFILE.LENGLENS ()> 0) {// Determine se existe um registro fileInputStream fis = new FileInputStream (PositionFile); BufferErader BR = new BufferredReader (novo InputStreamReader (FIS)); // Obtenha o tamanho total do thread atual lastTotalStr = Br.readline (); int lastTotal = Integer.valueof (lastTotalStr); System.out.println ("Último thread" + ThreadID + "Tamanho total do download:" + LastTotal); startIndex += lasttotal; Total += LastTotal; // Adicione o tamanho total do último download. fis.close (); } conn.setRequestProperty ("range", "bytes =" + startIndex + "-" + endindex); Conn.SetConnectTimeout (5000); int code = conn.getResponsecode (); System.out.println ("code =" + code); InputStream is = Conn.getInputStream (); Arquivo de arquivo = novo arquivo ("temp.exe"); RAF RAFACESSFILE RAF = novo RandomAccessFile (arquivo, "RW"); // Especifica onde o arquivo começa a gravar. RAF.SEEK (StartIndex); System.out.println ("th" + threadId + "threads: a posição inicial de gravar o arquivo:" + string.valueof (startIndex)); int len = 0; byte [] buffer = novo 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 (Exceção e) {e.printStackTrace (); } finalmente {// O arquivo de registro pode ser excluído depois que todos os threads foram baixados. sincronizado (mutilethreaddownload.class) {System.out.println ("thread" + threadId + "baixado"); RunningthreadCount--; if (runningthreadCount <1) {System.out.println ("Todos os threads acabam de funcionar. Exclua arquivos para registro temporário"); for (int i = 1; i <= threadCount; i ++) {arquivo f = novo arquivo (i+".txt"); System.out.println (f.Delete ()); } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } } }}}}}}}}}}}}}}}}}}}}}}}}}}}}}O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.