เธรดสามารถเข้าใจได้ว่าเป็นช่องดาวน์โหลด หนึ่งเธรดคือช่องดาวน์โหลดไฟล์ หลายเธรดหมายถึงการเปิดช่องดาวน์โหลดหลายช่องในเวลาเดียวกัน เมื่อเซิร์ฟเวอร์ให้บริการดาวน์โหลดผู้ใช้ดาวน์โหลดแบนด์วิดท์ เมื่อลำดับความสำคัญเท่ากันเซิร์ฟเวอร์ทั้งหมดจะจัดสรรเธรดการดาวน์โหลดทั้งหมดอย่างสม่ำเสมอ ไม่ยากที่จะเข้าใจ หากคุณมีเธรดมากมายยิ่งคุณดาวน์โหลดเร็วขึ้นเท่านั้น
ซอฟต์แวร์ดาวน์โหลดยอดนิยมรองรับมัลติเธรดและรองรับการดาวน์โหลดหยุดชั่วคราวกลางเวลา เมื่อคุณเริ่มต้นอีกครั้งคุณจะไม่ดาวน์โหลดตั้งแต่เริ่มต้น
ขั้นตอนในการใช้งานทั้งสองฟังก์ชั่นมีดังนี้:
(1) เมื่อเชื่อมต่อกับไฟล์ทรัพยากรดาวน์โหลดก่อนกำหนดขนาดของไฟล์ทรัพยากรและสร้างไฟล์ชั่วคราวที่มีขนาดเท่ากันในพื้นที่เพื่อจัดเก็บข้อมูลการดาวน์โหลด
(2) กำหนดขนาดไฟล์ที่จำเป็นสำหรับแต่ละเธรดตามจำนวนเธรด
(3) กำหนดตำแหน่งการดาวน์โหลดเริ่มต้นและสิ้นสุดของแต่ละเธรดตามขนาดไฟล์และจำนวนเธรดที่ดาวน์โหลดโดยแต่ละเธรดและกำหนดตำแหน่งการดาวน์โหลดเริ่มต้นและสิ้นสุดของแต่ละเธรดตามขนาดไฟล์และจำนวนเธรดที่ดาวน์โหลดโดยแต่ละเธรด
(4) เพื่อให้ตระหนักถึงฟังก์ชั่นการดาวน์โหลดเบรกพอยต์จำเป็นต้องทำเครื่องหมายตำแหน่งของการดาวน์โหลดแบบเรียลไทม์ของแต่ละเธรดเพื่ออำนวยความสะดวกในการดาวน์โหลดความคืบหน้าในครั้งแรกในครั้งต่อไป
เปิด 3 มุมมองดาวน์โหลดเธรด (ไดเรกทอรีดาวน์โหลดเริ่มต้นเป็นโครงการภายใต้ Java):
รหัสการใช้งานโดยรวมมีดังนี้ (ยังมีพื้นที่มากมายสำหรับการเพิ่มประสิทธิภาพดังนั้นอย่าเพิ่งดูและเสร็จสิ้น)
นำเข้า java.io.bufferedreader; นำเข้า java.io.file; นำเข้า java.io.fileinputstream; นำเข้า java.io.inputstreamreader; นำเข้า java.io.randomaccessFile; นำเข้า java.net.httpurlconnection; String Path = "http://soft3.xzstatic.com/2015/10/hsjj2ghgzh.rar"; public Static int threadCount = 0; // ประกาศจำนวนเธรดโมฆะสาธารณะคงที่หลัก (สตริง [] args) {ลอง {url url = url ใหม่ (เส้นทาง); // รับการเชื่อมต่อ httpurlconnection conn = (httpurlconnection) url.openconnection (); // กำหนดชื่อไฟล์โดยรับสตริงการเชื่อมต่อ [] str = path.split ("/"); Filename String = Str [5]; // รับขนาดไฟล์ดาวน์โหลด int filelength = conn.getContentLength (); System.out.println (ชื่อไฟล์); // สร้างไฟล์ที่เขียนแบบสุ่มที่สอดคล้องกับขนาดเซิร์ฟเวอร์แบบสุ่มในเครื่อง RandAccessFile RAF = new RandomAccessFile (ชื่อไฟล์, "RWD"); System.out.println (Filelength); // ทดสอบ raf.setLength (filelength); // custom count count threadCount = 3; // คำนวณขนาดของข้อมูลที่ดาวน์โหลดโดยแต่ละเธรด int blocksize = filelength / threadCount; // เริ่มต้นการดาวน์โหลดเธรดสำหรับ (int threadId = 1; threadId <= ThreadCount; ThreadId ++) {// Core Code, กำหนดตำแหน่งการดาวน์โหลดที่แต่ละเธรดเริ่มต้นและสิ้นสุดคือ int startPos = (threadId - 1) * blocksize; // ตำแหน่งที่การดาวน์โหลดเริ่มต้น = filelength; } เธรดใหม่ (ดาวน์โหลดใหม่ LoadkThread (ThreadId, StartPos, Endpos, Path)) .start (); }} catch (exception e) {e.printstacktrace (); }} // ใช้เธรดการดาวน์โหลดคลาสคงที่คลาสดาวน์โหลด LoadloadThread ใช้งาน Runnable {Private Int ThreadId; startpos int ส่วนตัว; endpos int ส่วนตัว; เส้นทางสตริงส่วนตัว Public DownloadloadThread (int threadId, int startPos, int endpos, เส้นทางสตริง) {super (); this.threadid = threadId; this.startpos = startpos; this.endPos = endpos; this.path = path; } โมฆะสาธารณะเรียกใช้ () {ลอง {url url = url ใหม่ (เส้นทาง); String [] str = path.split ("/"); Filename String = Str [5]; httpurlConnection conn = (httpurlConnection) url .OpenConnection (); // ตั้งค่าวิธีการร้องขอ URL (ดูที่ API สำหรับรายละเอียด) conn.setRequestMethod ("รับ"); // ตั้งค่า 500ms เป็นค่าหมดเวลา conn.setReadtimeout (5000); ไฟล์ไฟล์ = ไฟล์ใหม่ (threadId + ".txt"); if (file.exists () && file.length ()> 0) {bufferedreader br = new bufferedReader (ใหม่ inputStreamReader (ใหม่ fileInputStream (ไฟล์))); สตริง savestartPos = br.readline (); if (savestartpos! = null && savestartpos.length ()> 0) {startPos = integer.parseInt (SavestartPos); }} // ให้ความสนใจกับรูปแบบในคำพูดสองครั้งและไม่สามารถมีช่องว่าง (เช่นอักขระอื่น ๆ ) มิฉะนั้นจะมีการรายงาน 416 conn.setRequestProperty ("ช่วง", "bytes =" + startpos + "-" + endpos); RandomAccessFile RAF = new RandomActSfile (ชื่อไฟล์, "rwd"); // การจัดเก็บไฟล์การเขียนแบบสุ่มลงในไฟล์ดาวน์โหลด raf.seek (startpos); // ตั้งตำแหน่งเพื่อเริ่มต้นดาวน์โหลด system.out.println ("เธรด" + เธรด + ":" inputStream คือ = conn.getInputStream (); ไบต์ [] b = ไบต์ใหม่ [1024 * 1024 * 10]; int len = -1; int newpos = startpos; ในขณะที่ ((len = is.read (b))! = -1) {randomaccessFile rr = new randomActEncessFile (ไฟล์, "rwd"); // ไฟล์ที่จัดเก็บแท็กดาวน์โหลด raf.write (b, 0, len); // บันทึกแท็กดาวน์โหลดไปยังสตริงเอกสารที่ระบุ savapoint = string.valueof (newpos += len); rr.write (savapoint.getBytes ()); rr.close (); } is.close (); raf.close (); System.out.println ("ดาวน์โหลดเสร็จสมบูรณ์"); } catch (exception e) {e.printstacktrace (); -หมายเหตุ:
(1) เข้าใจวิธีการคำนวณของตำแหน่งเริ่มต้นและสิ้นสุดของการดาวน์โหลดแต่ละเธรด (ไม่รวมเธรดสุดท้ายเริ่มจาก 0)
start position = (จำนวนเธรด - 1) * ความยาว (ขนาด) ของไฟล์ที่จะดาวน์โหลดโดยแต่ละเธรด
end position = (จำนวนเธรด * ขนาดไฟล์ที่ดาวน์โหลดโดยแต่ละเธรด) -1
(2) ตำแหน่งเริ่มต้นการดาวน์โหลดที่กำหนดโดยเธรดสุดท้ายคือตำแหน่งสิ้นสุดของเธรดก่อนหน้าและตำแหน่งสุดท้ายคือความยาวไฟล์
ดังนั้นความยาวไฟล์ที่ดาวน์โหลดโดยเธรดสุดท้ายโดยทั่วไปจะไม่เหมือนกับเธรดก่อนหน้า
(3) เส้นทางการดาวน์โหลดของการสาธิตนี้เป็นไดเรกทอรีที่โครงการ Java ตั้งอยู่ตามค่าเริ่มต้นและไดเรกทอรีไม่สามารถมีไฟล์ที่มีชื่อเดียวกับไฟล์ที่ดาวน์โหลดมิฉะนั้นโปรแกรมจะรายงานข้อผิดพลาดคำขอเครือข่าย 416
(4) ความผิดพลาดที่ฉันทำในการใช้งาน conn.setRequestProperty ("ช่วง", "bytes ="+startpos+"-"+endpos); ตรวจสอบให้แน่ใจว่าคำพูดไม่จำเป็นต้องมีพื้นที่พิเศษและอักขระอื่น ๆ ฉันเพิ่งมีพื้นที่ในคำพูด แต่การวางตำแหน่งข้อผิดพลาดนั้นเป็นข้อผิดพลาดอินพุตสตรีมมาโดยตลอดและมันก็เจ็บปวดมากที่จะพบสิ่งที่ผิด
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น