في الآونة الأخيرة ، تعلمت ودرست استخدام Java Multi-Thrheading عند إجراء تحسين الكود ، ثم قمت بتلخيصها بعد قراءة رؤى المبتدئين.
1. ورث فئة الخيط لتنفيذ متعدد الخيوط
على الرغم من أن الطريقة التي ترث فئة مؤشرات الترابط مدرجة كطريقة تنفيذ متعددة الخيوط ، فإن مؤشر الترابط هو أساسًا مثيل الواجهة القابلة للتشغيل ، والذي يمثل مثيلًا لمؤشر ترابط ، والطريقة الوحيدة لبدء تشغيل مؤشر ترابط هي من خلال طريقة مثيل Start () لفئة مؤشر الترابط. طريقة Start () هي طريقة أصلية ستبدأ مؤشر ترابط جديد وتنفيذ طريقة Run (). هذه الطريقة بسيطة للغاية لتنفيذ متعدد الخيوط. من خلال توسيع نطاق الخيط مباشرة من خلال فصلك الخاص وإعادة كتابة طريقة Run () ، يمكنك بدء تشغيل مؤشر ترابط جديد وتنفيذ طريقة Run () التي تحددها. على سبيل المثال:
الطبقة العامة MyThread يمتد Thread {public void run () {system.out.println ("mythread.run ()") ؛ }} ابدأ الخيط في المكان الصحيح على النحو التالي:
mythread mythread1 = new MyThread () ؛ mythread mythread2 = new MyThread () ؛ mythread1.start () ؛ mythread2.start () ؛
2. تنفيذ الواجهة القابلة للتشغيل لتنفيذ متعدد الخيوط
إذا كان الفصل الخاص بك يمتد بالفعل فئة أخرى ، فلا يمكنك تمديد سلسلة الرسائل مباشرة. في هذا الوقت ، يجب عليك تطبيق واجهة قابلة للتشغيل ، على النحو التالي:
الطبقة العامة myTherd يمتد الأدوات الأخرى {public void run () {system.out.println ("mythread.run ()") ؛ }} من أجل بدء تشغيل mythread ، تحتاج إلى إنشاء سلسلة من الخيط والتمرير في مثيل mythread الخاص بك:
mythread mythread = new MyThread () ؛ موضوع الموضوع = مؤشر ترابط جديد (mythread) ؛ thread.start () ؛
في الواقع ، عندما يتم تمرير المعلمة الهدف القابلة للتشغيل إلى مؤشر ترابط ، فإن طريقة Run () من مؤشر الترابط سوف تستدعي target.run () ، راجع رمز مصدر JDK:
public void run () {if (target! = null) {target.run () ؛ }} 3. استخدم ExecutorService ، قابل للاتصال ، والمستقبل لتحقيق متعدد الخيوط مع نتائج الإرجاع
تعد شركة ExecutorService ، القابلة للاتصال ، والكائنات المستقبلية فئات وظيفية في إطار المنفذ. هذا شرح مفصل للغاية للإطار. الخيط الذي يعيد النتيجة هو ميزة جديدة تم تقديمها في JDK1.5. إنه بالفعل عملي للغاية. مع هذه الميزة ، لست بحاجة إلى مواجهة الكثير من المتاعب للحصول على قيمة الإرجاع ، وحتى إذا تم تنفيذها ، فقد تكون مليئة بالثغرات.
يجب أن تنفذ المهام التي يمكنها إرجاع القيم الواجهة القابلة للاستدعاء ، وبالمثل ، يجب أن تحتوي المهام التي لا تُرجع على الواجهة القابلة للتشغيل. بعد تنفيذ المهمة القابلة للاتصال ، يمكنك الحصول على كائن مستقبلي. اتصل على الكائن لإرجاع الكائن بواسطة المهمة القابلة للاتصال. إلى جانب خدمة ExecutorService ، يمكنك إدراك الرئاسة المتعددة الأسطورية مع نتيجة الإرجاع. فيما يلي مثال اختبار متعدد الخيوط مع النتائج التي تم إرجاعها. إذا كنت قد قمت بالتحقق منه تحت JDK1.5 ، فيمكنك استخدامه مباشرة. الرمز كما يلي:
استيراد java.util.concurrent.*؛ استيراد java.util.date ؛ استيراد java.util.list ؛ استيراد java.util.arraylist ؛ / *** مؤشر ترابط مع قيمة الإرجاع*/ suppressWarnings ("غير محدد") اختبار الفئة العامة {public static void main (string [] System.out.println("------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Create a thread pool ExecutorService pool = Executors.NewFixedTherPool (Tasksize) ؛ System.out.println (">>>" + f.get (). toString ()) ؛ // احصل على نتائج التشغيل لجميع المهام المتزامنة لـ (Future F: List) {// احصل على قيمة الإرجاع للمهمة من الكائن المستقبلي وإخراجها إلى نظام وحدة التحكم. } Date Date2 = New Date () ؛ System.out.println("----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- MyCallable (string tasknum) {this.tasknum = tasknum ؛ System.out.println (">>>" + TaskNum + "إنهاء المهمة") ؛ وصف الرمز:
في الكود أعلاه ، توفر فئة Executors سلسلة من أساليب المصنع لإنشاء تجمع مؤشرات الترابط ، وتنفيذ جميع مجموعة مؤشرات الترابط التي تم إرجاعها واجهة ExecutorService.
static static sevicorservice newfixedthreadpool (int nthreads)
ينشئ تجمع الخيوط مع عدد ثابت من المواضيع.
static static evecororservice newcachedthreadpool ()
قم بإنشاء تجمع مؤشرات ترابط قابلة للتخزين مؤقت ، وسيعيد تنفيذ الاستدعاء إعادة استخدام مؤشرات الترابط التي تم إنشاؤها مسبقًا (إذا كان مؤشر الترابط متاحًا). إذا لم يكن الخيط الموجود متاحًا ، فقم بإنشاء مؤشر ترابط جديد وأضفه إلى حمام السباحة. إنهاء وإزالة الخيوط من ذاكرة التخزين المؤقت التي لم يتم استخدامها لمدة 60 ثانية.
static static evecororservice newsinglethreadexecutor ()
إنشاء منفذ واحد.
Schedexecutorservice Schedulexutorservice NewsChedThreadPool (int corepoolsize)
قم بإنشاء تجمع مؤشرات ترابط يدعم تنفيذ المهمة الموقوت والدوري ، والذي يمكن استخدامه في معظم الحالات بدلاً من فئة المؤقت.
يوفر ExecutoreService طريقة إرسال () ، أو تمرير المستقبل القابل للاتصال ، أو القابل للتشغيل ، والمستقبل العائد. إذا لم يكمل تجمع مؤشرات ترابط خلفية المنفذ حساب القابل للاتصال ، فإن هذه المكالمة تُرجع طريقة GET () للكائن المستقبلي ، والتي سيتم حظرها حتى يتم اكتمال الحساب.