1. إرجاع البيانات من خلال متغيرات وأساليب الفصل
يتطلب استخدام هذه الطريقة لإرجاع البيانات استدعاء طريقة البدء قبل إمكانية الحصول على البيانات من خلال متغيرات الفئة أو الأساليب. دعونا نرى أولاً النتائج التي نحصل عليها من المثال 2-13.
انسخ رمز الكود كما يلي:
الحزمة الأسطورية؛
الطبقة العامة MyThread تمتد الموضوع
{
قيمة السلسلة الخاصة 1؛
قيمة السلسلة الخاصة 2؛
تشغيل الفراغ العام ()
{
value1 = "إرجاع البيانات من خلال متغيرات الأعضاء";
value2 = "إرجاع البيانات من خلال طريقة العضو";
}
يلقي الفراغ الرئيسي العام (String[] args) استثناءً
{
MyThread thread = new MyThread();
Thread.start();
System.out.println("value1:" + thread.value1);
System.out.println("value2:" + thread.value2);
}
}
قد يؤدي تشغيل الكود أعلاه إلى إخراج النتائج التالية:
انسخ رمز الكود كما يلي:
القيمة 1: فارغة
القيمة 2: فارغة
نتائج التشغيل المذكورة أعلاه تبدو غير طبيعية للغاية. تم تعيين القيم إلى value1 وvalue2 في طريقة التشغيل، ولكن تم إرجاع القيمة null. والسبب في ذلك هو أن قيم value1 و value2 يتم إخراجها مباشرة بعد استدعاء طريقة البدء، ولم تقم طريقة التشغيل هنا بعد بتنفيذ العبارات التي تحدد قيم value1 و value2. لتجنب هذا الموقف، عليك الانتظار حتى يتم تنفيذ طريقة التشغيل قبل تنفيذ التعليمات البرمجية التي تنتج value1 وvalue2. لذلك، يمكننا التفكير في استخدام طريقة السكون لتأخير الخيط الرئيسي، على سبيل المثال، يمكننا إضافة العبارة التالية بعد Thread.start():
نوم(1000);
يمكن أن يؤدي القيام بذلك إلى تأخير الخيط الرئيسي لمدة ثانية واحدة قبل المتابعة، ولكن هناك مشكلة في ذلك، وهي كيف نعرف مدة التأخير. في هذا المثال، لا يوجد سوى بياني مهمة في طريقة التشغيل، ويتم إنشاء مؤشر ترابط واحد فقط، لذلك يكون التأخير لمدة ثانية واحدة كافيًا، ولكن إذا كانت العبارات في طريقة التشغيل معقدة، فمن الصعب التنبؤ بهذه المرة. ولذلك فإن هذه الطريقة غير مستقرة.
هدفنا هو الحصول على قيمتي value1 و value2، لذلك نحتاج فقط إلى تحديد ما إذا كانت value1 و value2 فارغة. إذا لم يكن أي منهما فارغًا، فيمكن إخراج هاتين القيمتين. يمكننا استخدام الكود التالي لتحقيق هذا الغرض:
انسخ رمز الكود كما يلي:
while (thread.value1 == null || thread.value2 == null);
باستخدام البيان أعلاه يمكن تجنب هذا الموقف بشكل مستقر للغاية، ولكن هذه الطريقة تستهلك الكثير من موارد النظام. يمكنك أن تتخيل أنه إذا كان الكود الموجود في طريقة التشغيل معقدًا للغاية، فسيستغرق تعيين القيمة 1 والقيمة 2 وقتًا طويلاً، لذلك يجب أن يستمر تنفيذ الحلقة أثناء حتى تصبح القيمة 1 والقيمة 2 فارغة. لذلك، يمكننا إجراء التحسينات التالية على العبارة أعلاه:
انسخ رمز الكود كما يلي:
بينما (thread.value1 == null || thread.value2 == null)
نوم(100);
في الحلقة while، بعد الحكم على قيم value1 وvalue2 لأول مرة، فإنه ينام لمدة 100 مللي ثانية، ثم يحكم على هاتين القيمتين. وهذا سوف يشغل موارد النظام أقل.
على الرغم من أن الطريقة المذكورة أعلاه يمكن حلها بشكل جيد للغاية، إلا أن نموذج ترابط Java يوفر لنا حلاً أفضل، وهو طريقة الانضمام. كما تمت مناقشته من قبل، تتمثل وظيفة الانضمام في استخدام سلاسل الرسائل للتغيير من التنفيذ غير المتزامن إلى التنفيذ المتزامن. عندما يتم تنفيذ مؤشر الترابط بشكل متزامن، لا يختلف الأمر عن الحصول على بيانات الإرجاع من الطريقة العادية. ولذلك، يمكن حل هذه المشكلة بكفاءة أكبر باستخدام التعليمات البرمجية مثل ما يلي:
انسخ رمز الكود كما يلي:
Thread.start();
Thread.join();
بعد تنفيذ thread.join()، تم الخروج من طريقة تشغيل مؤشر الترابط، مما يعني أن مؤشر الترابط قد انتهى. لذلك، يمكنك استخدام أي مورد من فئة MyThread بأمان بعد Thread.join() للحصول على البيانات التي تم إرجاعها.
2. إرجاع البيانات من خلال وظيفة رد الاتصال
في الواقع، تم تقديم هذه الطريقة في "الطرق الثلاث لتمرير البيانات إلى الخيوط". في مثال المقالة "ثلاث طرق لتمرير البيانات إلى الخيوط"، يتم تمرير نتائج الحساب إلى الخيط من خلال طريقة المعالجة الخاصة بفئة العمل، ولكن في نفس الوقت، يتم أيضًا الحصول على ثلاثة أرقام عشوائية من الخيط من خلال طريقة العملية. لذلك، يمكن لهذه الطريقة تمرير البيانات إلى مؤشر الترابط والحصول عليها.