في نموذج التطوير المتزامن التقليدي، عندما نستدعي دالة، يتم تمرير البيانات من خلال معلمات الوظيفة، ويتم إرجاع نتيجة الحساب النهائية من خلال القيمة المرجعة للوظيفة. ومع ذلك، في وضع التطوير غير المتزامن متعدد الخيوط، يختلف نقل البيانات وإعادتها تمامًا عن وضع التطوير المتزامن. نظرًا لأن تشغيل سلاسل الرسائل وإنهائها لا يمكن التنبؤ به، عند نقل البيانات وإعادتها، لا يمكن إرجاع البيانات من خلال معلمات الوظائف وعبارات الإرجاع مثل الوظائف. تقدم هذه المقالة عدة طرق لتمرير البيانات إلى سلاسل الرسائل للأسباب المذكورة أعلاه. في المقالة التالية، سنقدم طرقًا لإرجاع البيانات من سلاسل الرسائل.
إذا كنت تريد أن تأخذه أولاً، فيجب أن تعطيه أولاً. بشكل عام، عند استخدام سلاسل الرسائل، تكون بعض بيانات التهيئة مطلوبة، ثم يستخدم مؤشر الترابط هذه البيانات لمعالجة النتائج وإرجاعها. أول شيء يجب فعله في هذه العملية هو تمرير البيانات إلى سلسلة المحادثات.
1. قم بتمرير البيانات من خلال طريقة المنشئ <BR> عند إنشاء سلسلة رسائل، يجب عليك إنشاء مثيل لفئة Thread أو فئتها الفرعية. لذلك، ليس من الصعب علينا التفكير في تمرير البيانات إلى مؤشر الترابط من خلال طريقة البناء لفئة مؤشر الترابط قبل استدعاء طريقة البدء. وحفظ البيانات الواردة باستخدام متغيرات الفئة لاستخدامها بواسطة الخيط (المستخدمة بالفعل في طريقة التشغيل). يوضح التعليمة البرمجية التالية كيفية تمرير البيانات من خلال المنشئ:
انسخ رمز الكود كما يلي:
الحزمة الأسطورية؛
الطبقة العامة MyThread1 تمتد الموضوع
{
اسم سلسلة خاصة؛
MyThread1 العام (اسم السلسلة)
{
this.name = name;
}
تشغيل الفراغ العام ()
{
System.out.println("مرحبا" + اسم);
}
الفراغ العام الثابت الرئيسي (String[] args)
{
موضوع الموضوع = new MyThread1("world");
Thread.start();
}
}
نظرًا لأن هذه الطريقة تنقل البيانات أثناء إنشاء كائن مؤشر الترابط، فإن البيانات موجودة بالفعل قبل تشغيل مؤشر الترابط، لذلك لن يتم تمرير البيانات بعد تشغيل مؤشر الترابط. إذا كنت تريد تمرير بيانات أكثر تعقيدًا، فيمكنك استخدام هياكل البيانات مثل المجموعات والفئات. على الرغم من أنه من الآمن استخدام طريقة الإنشاء لنقل البيانات، إلا أنها ستسبب الكثير من الإزعاج إذا كان هناك الكثير من البيانات التي سيتم نقلها. نظرًا لأن Java لا تحتوي على معلمات افتراضية، إذا كنت تريد تحقيق تأثيرات مشابهة للمعلمات الافتراضية، فيجب عليك استخدام التحميل الزائد، وهذا لا يجعل المُنشئ نفسه معقدًا للغاية فحسب، بل يزيد أيضًا من عدد المُنشئين بشكل كبير. لذلك، لتجنب هذا الموقف، قم بتمرير البيانات من خلال أساليب الفئة أو متغيرات الفئة.
2. تمرير البيانات من خلال المتغيرات والأساليب <BR> هناك بشكل عام فرصتان لتمرير البيانات إلى كائن، الفرصة الأولى هي تمرير البيانات من خلال أسلوب المنشئ عند إنشاء الكائن، والفرصة الأخرى هي تحديد سلسلة من البيانات في الطبقة العامة أو المتغيرات (وتسمى أيضا الحقول). ثم بعد إنشاء الكائن، قم بتعيين القيم واحدة تلو الأخرى من خلال مثيلات الكائن. التعليمة البرمجية التالية هي تعديل لفئة MyThread1، وذلك باستخدام طريقة setName لتعيين متغير الاسم:
انسخ رمز الكود كما يلي:
الحزمة الأسطورية؛
الطبقة العامة MyThread2 تنفذ Runnable
{
اسم سلسلة خاصة؛
اسم مجموعة الفراغ العام (اسم السلسلة)
{
this.name = name;
}
تشغيل الفراغ العام ()
{
System.out.println("مرحبا" + اسم);
}
الفراغ العام الثابت الرئيسي (String[] args)
{
MyThread2 myThread = new MyThread2();
myThread.setName("world");
موضوع الموضوع = موضوع جديد (myThread)؛
Thread.start();
}
}
3. تمرير البيانات من خلال وظائف رد الاتصال <BR> تعد الطريقتان الأكثر استخدامًا لتمرير البيانات إلى سلاسل الرسائل التي تمت مناقشتها أعلاه. لكن كلتا الطريقتين تقومان بتمرير البيانات بشكل نشط إلى فئة مؤشر الترابط في الطريقة الرئيسية. بالنسبة للخيوط، يتم تلقي هذه البيانات بشكل سلبي. ومع ذلك، في بعض التطبيقات، من الضروري الحصول على البيانات ديناميكيًا أثناء تشغيل مؤشر الترابط، على سبيل المثال، يتم إنشاء ثلاثة أرقام عشوائية في طريقة التشغيل للكود التالي، ثم يتم حساب مجموع هذه الأرقام العشوائية الثلاثة من خلال طريقة العملية. لفئة العمل، وإرجاع النتيجة من خلال قيمة فئة البيانات. كما يتبين من هذا المثال، يجب الحصول على ثلاثة أرقام عشوائية قبل إرجاع القيمة. بمعنى آخر، لا يمكن تمرير هذه القيمة إلى فئة مؤشر الترابط مسبقًا.
انسخ رمز الكود كما يلي:
الحزمة الأسطورية؛
بيانات الطبقة
{
قيمة كثافة العمليات العامة = 0؛
}
العمل الصفي
{
عملية الفراغ العام (بيانات البيانات والأرقام الصحيحة)
{
لـ (int n: أرقام)
{
data.value += n;
}
}
}
الطبقة العامة MyThread3 تمتد الموضوع
{
العمل الخاص؛
MyThread3 العام (عمل العمل)
{
this.work=work;
}
تشغيل الفراغ العام ()
{
java.util.Random Random = new java.util.Random();
بيانات البيانات = بيانات جديدة ()؛
int n1 = Random.nextInt(1000);
int n2 = Random.nextInt(2000);
int n3 = Random.nextInt(3000);
Work.process(data, n1, n2, n3);// استخدم وظيفة رد الاتصال
System.out.println(String.valueOf(n1) + "+" + String.valueOf(n2) + "+"
+ String.valueOf(n3) + "=" + data.value);
}
الفراغ العام الثابت الرئيسي (String[] args)
{
موضوع الموضوع = new MyThread3(new Work());
Thread.start();
}
}
تسمى طريقة العملية في الكود أعلاه وظيفة رد الاتصال. في جوهرها، وظائف رد الاتصال هي وظائف الحدث. في Windows API، غالبًا ما تُستخدم وظائف رد الاتصال للتفاعل مع البيانات بين البرنامج الذي يستدعي واجهة برمجة التطبيقات (API). ولذلك، فإن عملية استدعاء وظيفة رد الاتصال هي العملية الأصلية لتشغيل الحدث. في هذا المثال، استدعاء أسلوب العملية للحصول على البيانات يعادل تشغيل حدث في أسلوب التشغيل.