Utas dapat dipahami sebagai saluran unduhan. Satu utas adalah saluran unduhan file. Beberapa utas berarti membuka beberapa saluran unduhan secara bersamaan. Ketika server menyediakan layanan unduhan, pengunduh pengguna membagikan bandwidth. Ketika prioritasnya sama, server total akan secara merata mengalokasikan utas unduhan total. Tidak sulit untuk dipahami. Jika Anda memiliki banyak utas, semakin cepat Anda mengunduhnya.
Perangkat lunak unduhan populer mendukung multi-threading dan mendukung unduhan jeda tengah waktu. Ketika Anda mulai lagi, Anda tidak akan mengunduh dari awal.
Langkah -langkah untuk mengimplementasikan kedua fungsi adalah sebagai berikut:
(1) Saat menghubungkan ke file sumber daya unduhan, pertama -tama tentukan ukuran file sumber daya dan buat file sementara dengan ukuran yang sama secara lokal untuk menyimpan data unduhan.
(2) Tentukan ukuran file yang diperlukan untuk setiap utas berdasarkan jumlah utas
(3) Tentukan lokasi unduhan start dan end dari setiap utas sesuai dengan ukuran file dan jumlah utas yang diunduh oleh setiap utas, dan tentukan lokasi unduhan awal dan akhir dari setiap utas sesuai dengan ukuran file dan jumlah utas yang diunduh oleh setiap utas.
(4) Untuk mewujudkan fungsi unduhan breakpoint, perlu untuk menandai lokasi unduhan waktu-nyata dari setiap utas untuk memfasilitasi unduhan kemajuan di awal waktu berikutnya.
Open 3 Thread Download Views (Direktori Unduhan Default adalah proyek di bawah Java):
Kode implementasi keseluruhan adalah sebagai berikut (masih ada banyak ruang untuk optimasi, jadi jangan hanya melihatnya dan sudah selesai)
Impor java.io.bufferedreader; impor java.io.file; impor java.io.fileinputStream; impor java.io.inputStreamreader; import java.io.randomaccessfile; impor publicer {httpurlconnection (impor java.net.net. final string path = "http://soft3.xzstatic.com/2015/10/hsjj2ghgzh.rar"; public static int threadCount = 0; // Nyatakan jumlah utas public static void main (string [] args) {coba {url url = URL baru (path); // Dapatkan koneksi httpurlConnection conn = (httpurlConnection) url.openconnection (); // Tentukan nama file dengan mendapatkan string koneksi [] str = path.split ("/"); String fileName = str [5]; // Dapatkan Ukuran File Unduh Int FileLelength = conn.getContentLength (); System.out.println (nama file); // Buat file tertulis secara acak yang konsisten dengan ukuran server secara lokal acak ACCHECESSFILE RAF = RandomAccessFile baru (nama file, "rwd"); System.out.println (FileLength); // uji raf.setlength (filelength); // utas kustom threadcount = 3; // Hitung ukuran data yang diunduh oleh setiap thread int blocksize = filelength / threadCount; // Start thread download for (int threadId = 1; threadId <= threadCount; threadId++) { // Core code, define the download location at which each thread starts and ends is int startPos = (threadId - 1) * blockSize;// The location at which the download starts int endPos = (threadId * blockSize) - 1;// The location at which the download ends (not including the last piece) if (threadCount == threadId) { endPos = panjang file; } utas baru (unduhan baru (threadId, startpos, endpos, path)) .start (); }} catch (Exception e) {e.printstacktrace (); }} // Implementasikan unduhan thread static class downloadThread implement runnable {private int threadId; startpos int pribadi; endpos int pribadi; jalur string pribadi; download muat umum (int threadId, int startpos, int endpos, string path) {super (); this.threadid = threadId; this.startpos = startpos; this.endpos = endpos; this.path = path; } public void run () {coba {url url = URL baru (path); String [] str = path.split ("/"); String fileName = str [5]; HttpurlConnection conn = (httpurlconnection) url .openconnection (); // Atur metode permintaan URL (lihat API untuk detail) conn.setRequestMethod ("get"); // atur 500ms sebagai nilai batas waktu conn.setreadtimeout (5000); File file = file baru (threadId + ".txt"); if (file.exists () && file.length ()> 0) {buferedReader br = baru buferedReader (inputStreamReader baru (fileInputStream baru (file)))); String saveStartpos = br.readline (); if (saveStArtPos! = null && saveStartpos.length ()> 0) {startPos = integer.parseint (saveStArtPos); }} // Perhatikan format dalam kutipan ganda, dan tidak dapat berisi spasi (seperti karakter lain), jika tidak 416 dilaporkan. conn.setRequestProperty ("range", "bytes =" + startpos + "-" + endpos); RandomAccessFile raf = new RandomAccessFile(fileName, "rwd");// Storing the random write file to the download file raf.seek(startPos);// Set the location to start download System.out.println("Thread" + threadId + ":" + startPos + "~~" + endPos); InputStream adalah = conn.getInputStream (); byte [] b = byte baru [1024 * 1024 * 10]; int len = -1; int newPos = startPos; while ((len = is.read (b))! = -1) {randomAccessFile rr = new acakAccessFile (file, "rwd"); // file menyimpan tag unduhan raf.write (b, 0, len); // Simpan tag unduhan ke dokumen yang ditentukan string savapoint = string.valueof (newPos += len); rr.write (savapoint.getbytes ()); rr.close (); } is.close (); raf.close (); System.out.println ("Unduh Lengkap"); } catch (Exception e) {E.PrintStackTrace (); }}}}Catatan:
(1) Memahami metode perhitungan dari posisi awal dan akhir dari setiap unduhan utas (tidak termasuk utas terakhir, mulai dari 0)
Posisi Mulai = (jumlah utas - 1) * Panjang (ukuran) file yang akan diunduh oleh setiap utas
Posisi akhir = (jumlah utas * ukuran file yang diunduh oleh setiap utas) -1
(2) Posisi awal unduhan yang ditetapkan oleh utas terakhir adalah posisi akhir dari utas sebelumnya, dan posisi akhir adalah panjang file.
Oleh karena itu, panjang file yang diunduh oleh utas terakhir umumnya tidak akan sama dengan utas sebelumnya
(3) Jalur unduhan dari demonstrasi ini adalah direktori di mana proyek Java terletak secara default, dan direktori tidak dapat berisi file dengan nama yang sama dengan file yang diunduh, jika tidak program akan melaporkan kesalahan permintaan jaringan 416.
(4) kesalahan yang saya buat dalam implementasi conn.setRequestProperty ("range", "bytes ="+startpos+"-"+endpos); Pastikan untuk mencatat bahwa kutipan tidak harus memiliki ruang tambahan dan karakter lainnya. Saya hanya memiliki ruang dalam kutipan, tetapi posisi kesalahan selalu menjadi kesalahan inputstream, dan sangat menyakitkan untuk menemukan yang salah.
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.