يظهر مبدأ تنزيل نقطة توقف متعددة الخيوط Java في الشكل:
الرمز كما يلي:
استيراد java.io.bufferedreader ؛ استيراد java.io.file ؛ استيراد java.io.fileInputStream ؛ استيراد java.io.inputstreamreader ؛ استيراد java.io.randomaccessfile ؛ استيراد java.net.httpurlconnection ؛ استيراد java.net.url ؛ الطبقة العامة mifilethReadDownload { / *** عدد مؤشرات الترابط* / private static int threadcount = 3 ؛ / *** حجم كل كتلة تنزيل*/ كتل طويلة ثابتة ؛ / *** عدد المواضيع الجارية*/ private static int runnthreadCount ؛ /** * param args * athrows استثناء */public static void main (string [] args) يرمي الاستثناء {// مسار سلسلة ملف الخادم att = "http://192.168.1.100:8080/ff.exe" ؛ url url = url جديد (مسار) ؛ httpurlConnection conn = (httpurlConnection) url.openconnection () ؛ Conn.SetRequestMethod ("get") ؛ Conn.SetConnectTimeout (5000) ؛ رمز int = conn.getResPonsecode () ؛ if (code == 200) {long size = conn.getContentLength () ؛ // احصل على حجم الملف الذي تم إرجاعه بواسطة server system.out.println ("حجم ملف الخادم:" + حجم) ؛ blockize = الحجم / threadcount ؛ // 1. قم أولاً بإنشاء ملف فارغ بنفس حجم الخادم محليًا. ملف الملف = ملف جديد ("temp.exe") ؛ RandomAccessFile raf = new RandomAccessFile (ملف ، "RW") ؛ raf.setlength (الحجم) ؛ // 2. افتح العديد من خيوط الأطفال لتنزيل الموارد المقابلة بشكل منفصل. RunntThReadCount = threadCount ؛ لـ (int i = 1 ؛ i <= threadcount ؛ i ++) {long startIndex = (i - 1) * blockize ؛ Long EndIndEx = i * blockize - 1 ؛ if (i == threadCount) {// آخر مؤشر ترابط endindex = size - 1 ؛ } system.out.println ("Start Thread:" + I + "تنزيل الموقع:" + StartIndex + "~" + EndIndex) ؛ جديد تنزيل (path ، i ، startIndex ، endindex) .start () ؛ }} conn.disconnect () ؛ } فئة ثابتة خاصة تنزيلها يمتد الموضوع {private int threadID ؛ startIndex الطويل الخاص ؛ endindex الطويل الخاص ؛ مسار السلسلة الخاص Public DownloadThread (مسار السلسلة ، int threadID ، startIndex الطويل ، long endindex) {this.path = path ؛ this.throadid = threadId ؛ this.startIndex = startIndex ؛ this.endIndex = endIndex ؛ } Override public void run () {try {// الحجم الإجمالي لتنزيل مؤشر الترابط الحالي int total = 0 ؛ file positionfile = ملف جديد (threadId + ".txt") ؛ url url = url جديد (مسار) ؛ httpurlConnection conn = (httpurlConnection) url .OpenConnection () ؛ Conn.SetRequestMethod ("get") ؛ // ثم تابع تنزيل البيانات من الموقع السابق if (positionfile.exists () && positionfile.length ()> 0) {// تحديد ما إذا كان هناك سجل fileInputStream fis = جديد fileInputStream (positionfile) ؛ BufferedReader BR = جديد BufferedReader (New InputStreamReader (FIS)) ؛ // احصل على الحجم الإجمالي للموضوع الحالي LASTTOTALSTR = BR.ReadLine () ؛ int livttotal = integer.valueof (lastTotalStr) ؛ System.out.println ("Last Thread" + ThreadId + "حجم الإجمالي للتنزيل:" + lastTotal) ؛ startIndex += lastTotal ؛ إجمالي += LACTTOTAL ؛ // أضف الحجم الإجمالي للتنزيل الأخير. fis.close () ؛ } conn.setRequestProperty ("Range" ، "bytes =" + startIndex + "-" + endIndex) ؛ Conn.SetConnectTimeout (5000) ؛ رمز int = conn.getResPonsecode () ؛ system.out.println ("code =" + code) ؛ inputStream هو = conn.getInputStream () ؛ ملف الملف = ملف جديد ("temp.exe") ؛ RandomAccessFile raf = new RandomAccessFile (ملف ، "RW") ؛ // يحدد المكان الذي يبدأ فيه الملف في الكتابة. raf.seek (startIndex) ؛ System.out.println ("TH" + ThreadId + "مؤشرات الترابط: موضع بدء كتابة الملف:" + string.valueof (startIndex)) ؛ int len = 0 ؛ Byte [] Buffer = New Byte [512] ؛ بينما ((len = iS.Read (buffer))! = -1) {randomaccessfile rf = new RandomAccessFile (positionfile ، "rwd") ؛ raf.write (Buffer ، 0 ، Len) ؛ المجموع += لين ؛ rf.write (string.valueof (total) .getBytes ()) ؛ rf.close () ؛ } is.close () ؛ raf.close () ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ } أخيرًا {// يمكن حذف ملف السجل بعد تنزيل جميع مؤشرات الترابط. Synchronized (mutilethReadDownload.class) {system.out.println ("Thread" + threadId + "downloaded") ؛ RunfrathreadCount-- ؛ if (RunntRateReadCount <1) {system.out.println ("يتم الانتهاء من جميع مؤشرات الترابط. حذف الملفات للتسجيل المؤقت") ؛ لـ (int i = 1 ؛ i <= threadcount ؛ i ++) {file f = new file (i+".txt") ؛ system.out.println (f.delete ()) ؛ }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} }}}}}}}}}}}}}}}}}}}}}}}}}}}}}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.