หลักการของการดาวน์โหลดจุดพักมัลติ-เธรดจาวาแสดงไว้ในรูป:
รหัสมีดังนี้:
นำเข้า java.io.bufferedreader; นำเข้า Java.io.File; นำเข้า Java.io.FileInputStream; นำเข้า Java.io.InputStreamReader; นำเข้า java.io.randomaccessFile; นำเข้า java.net.httpurlconnection; นำเข้า java.net.url; คลาสสาธารณะ mutileThreadDownLoad { / *** จำนวนเธรด* / ส่วนตัว int threadCount = 3; / *** ขนาดของบล็อกดาวน์โหลดแต่ละบล็อก*/ บล็อกขนาดยาวคงที่ส่วนตัว; / *** จำนวนเธรดการรัน*/ ส่วนตัวคงที่ int runningThreadCount; /** * @param args * @throws exception */โมฆะคงที่สาธารณะหลัก (สตริง [] args) โยนข้อยกเว้น {// พา ธ ของเส้นทางสตริงไฟล์เซิร์ฟเวอร์ = "http://192.168.1.100:8080/ff.exe"; url url = url ใหม่ (เส้นทาง); httpurlConnection conn = (httpurlconnection) url.openconnection (); conn.setRequestMethod ("รับ"); conn.setConnectTimeout (5000); int code = conn.getResponsecode (); if (code == 200) {long size = conn.getContentLength (); // รับขนาดของไฟล์ที่ส่งคืนโดย Server System.out.println ("ขนาดไฟล์เซิร์ฟเวอร์:" + ขนาด); blocksize = size / threadcount; // 1. ก่อนสร้างไฟล์ว่างที่มีขนาดเท่ากับเซิร์ฟเวอร์ในเครื่อง ไฟล์ไฟล์ = ไฟล์ใหม่ ("temp.exe"); RandomAccessFile RAF = new RandomActEncessFile (ไฟล์, "RW"); raf.setLength (ขนาด); // 2. เปิดเธรดเด็กหลายตัวเพื่อดาวน์โหลดทรัพยากรที่เกี่ยวข้องแยกกัน RunningThreadCount = ThreadCount; สำหรับ (int i = 1; i <= ThreadCount; i ++) {Long StartIndex = (i - 1) * blocksize; endindex ยาว = i * blocksize - 1; if (i == threadCount) {// เธรดสุดท้าย endIndex = size - 1; } system.out.println ("เริ่มเธรด:" + i + "ตำแหน่งดาวน์โหลด:" + startIndex + "~" + endindex); ใหม่ DownloadThread (PATH, I, StartIndex, EndIndex) .start (); }} conn.disconnect (); } คลาสคงที่คลาสคงที่ดาวน์โหลดเธรดขยายเธรด {private int threadId; startindex ส่วนตัวส่วนตัว; Endindex ยาวส่วนตัว; เส้นทางสตริงส่วนตัว Public DownloadThread (เส้นทางสตริง, int threadId, Long StartIndex, Long EndIndex) {this.path = path; this.threadid = threadId; this.startindex = startIndex; this.endIndex = endindex; } @Override โมฆะสาธารณะเรียกใช้ () {ลอง {// ขนาดรวมของเธรดปัจจุบันดาวน์โหลด int ทั้งหมด = 0; ไฟล์ positionfile = ไฟล์ใหม่ (threadid + ".txt"); url url = url ใหม่ (เส้นทาง); httpurlConnection conn = (httpurlConnection) url .OpenConnection (); conn.setRequestMethod ("รับ"); // จากนั้นดำเนินการดาวน์โหลดข้อมูลจากตำแหน่งก่อนหน้าถ้า (positionfile.exists () && positionfile.length ()> 0) {// ตรวจสอบว่ามีบันทึก fileinputstream fis = new fileInputStream (positionfile); bufferedReader br = bufferedReader ใหม่ (ใหม่ inputStreamReader (FIS)); // รับขนาดทั้งหมดของเธรดปัจจุบัน LastTotalStr = br.readline (); int lasttotal = integer.valueof (lasttotalstr); System.out.println ("เธรดสุดท้าย" + threadid + "ขนาดทั้งหมดของการดาวน์โหลด:" + lasttotal); startIndex += lasttotal; ทั้งหมด += lasttotal; // เพิ่มขนาดรวมของการดาวน์โหลดล่าสุด fis.close (); } conn.setRequestProperty ("ช่วง", "bytes =" + startIndex + "-" + endindex); conn.setConnectTimeout (5000); int code = conn.getResponsecode (); System.out.println ("code =" + รหัส); inputStream คือ = conn.getInputStream (); ไฟล์ไฟล์ = ไฟล์ใหม่ ("temp.exe"); RandomAccessFile RAF = new RandomActEncessFile (ไฟล์, "RW"); // ระบุตำแหน่งที่ไฟล์เริ่มเขียน raf.seek (startindex); System.out.println ("th" + threadid + "เธรด: ตำแหน่งเริ่มต้นของการเขียนไฟล์:" + string.valueof (startIndex)); int len = 0; ไบต์ [] บัฟเฟอร์ = ไบต์ใหม่ [512]; ในขณะที่ ((len = is.read (บัฟเฟอร์))! = -1) {randomaccessFile rf = new RandomAccessFile (PositionFile, "RWD"); raf.write (บัฟเฟอร์, 0, len); ทั้งหมด += len; rf.write (string.valueof (รวม) .getBytes ()); rf.close (); } is.close (); raf.close (); } catch (exception e) {e.printstacktrace (); } ในที่สุด {// ไฟล์บันทึกสามารถลบได้หลังจากดาวน์โหลดเธรดทั้งหมดแล้ว ซิงโครไนซ์ (mutileThreadDownload.class) {system.out.println ("เธรด" + threadid + "ดาวน์โหลด"); RunningThreadCount--; if (RunningThreadCount <1) {System.out.println ("เธรดทั้งหมดทำงานเสร็จแล้วลบไฟล์สำหรับบันทึกชั่วคราว"); สำหรับ (int i = 1; i <= threadCount; i ++) {ไฟล์ f = ไฟล์ใหม่ (i+".txt"); System.out.println (F.Delete ()); - -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น