هناك طريقتان لإنشاء سلاسل رسائل في Java: استخدام فئة Thread واستخدام الواجهة القابلة للتشغيل. عند استخدام واجهة Runnable، تحتاج إلى إنشاء مثيل Thread. لذلك، سواء قمت بإنشاء مؤشر ترابط من خلال فئة Thread أو الواجهة القابلة للتشغيل، يجب عليك إنشاء مثيل لفئة Thread أو فئتها الفرعية. تم تحميل مُنشئ فئة Thread ثماني مرات، والمنشئ كما يلي:
انسخ رمز الكود كما يلي:
الموضوع العام ()؛
الموضوع العام (هدف قابل للتشغيل) ؛
الموضوع العام (اسم السلسلة)؛
الموضوع العام (الهدف القابل للتشغيل، اسم السلسلة)؛
public Thread(ThreadGroup group, Runnable target);
الموضوع العام (مجموعة ThreadGroup، اسم السلسلة)؛
public Thread(ThreadGroup group, Runnable target, String name);
public Thread(ThreadGroup group, Runnable target, String name, long stackSize);
هدف قابل للتشغيل
مثيل لفئة تنفذ الواجهة القابلة للتشغيل. تجدر الإشارة إلى أن فئة Thread تنفذ أيضًا واجهة قابلة للتشغيل، لذلك يمكن أيضًا تمرير مثيلات الفئات الموروثة من فئة Thread إلى هذا المُنشئ كأهداف.
اسم السلسلة
اسم الخيط. يمكن تعيين هذا الاسم من خلال طريقة setName لفئة Thread بعد إنشاء مثيل Thread. إذا لم يتم تعيين اسم مؤشر الترابط، يستخدم مؤشر الترابط اسم مؤشر الترابط الافتراضي: Thread-N هو الترتيب الذي تم إنشاء مؤشر الترابط به وهو عدد صحيح موجب غير متكرر.
مجموعة الموضوع
مجموعة مؤشرات الترابط التي ينتمي إليها مؤشر الترابط الذي تم إنشاؤه حاليًا. إذا لم يتم تحديد مجموعة سلاسل رسائل، تتم إضافة كافة سلاسل الرسائل إلى مجموعة سلاسل رسائل افتراضية. سيتم مناقشة التفاصيل حول مجموعات المواضيع بالتفصيل في الفصول اللاحقة.
حجم المكدس الطويل
حجم مكدس مؤشر الترابط هذه القيمة بشكل عام عبارة عن عدد صحيح مضاعف لصفحة وحدة المعالجة المركزية. على سبيل المثال، حجم الصفحة x86 هو 4 كيلو بايت. ضمن النظام الأساسي x86، يكون حجم مكدس مؤشر الترابط الافتراضي هو 12 كيلو بايت.
يمكن لفئة Java العادية أن تصبح فئة سلسلة رسائل طالما أنها ترث من فئة Thread. ويمكن تنفيذ رمز الخيط من خلال طريقة البدء لفئة الخيط. على الرغم من أنه يمكن إنشاء مثيل للفئات الفرعية لفئة Thread مباشرة، إلا أنه يجب تجاوز طريقة تشغيل فئة Thread في الفئة الفرعية لتشغيل رمز مؤشر الترابط فعليًا. التعليمة البرمجية التالية تعطي مثالاً لاستخدام فئة Thread لإنشاء سلسلة رسائل:
انسخ رمز الكود كما يلي:
الحزمة الأسطورية؛
الطبقة العامة Thread1 تمتد الموضوع
{
تشغيل الفراغ العام ()
{
System.out.println(this.getName());
}
الفراغ العام الثابت الرئيسي (String[] args)
{
System.out.println(Thread.currentThread().getName());
Thread1 thread1 = new Thread1();
Thread1 thread2 = new Thread1 ();
Thread1.start();
Thread2.start();
}
}
ينشئ الكود أعلاه خيطين: Thread1 وthread2. الأسطر من 005 إلى 005 في الكود أعلاه هي طريقة التشغيل لفئة Thread1. عندما يتم استدعاء طريقة البدء في السطرين 014 و015، يقوم النظام تلقائيًا باستدعاء طريقة التشغيل. في السطر 007، يتم استخدام this.getName() لإخراج اسم مؤشر الترابط الحالي، نظرًا لعدم تحديد اسم مؤشر الترابط عند إنشاء مؤشر الترابط، فإن إخراج اسم مؤشر الترابط هو القيمة الافتراضية للنظام، والتي تكون في شكل مؤشر ترابط. -ن. يتم إخراج اسم الخيط الرئيسي على السطر 011.
نتائج تشغيل الكود أعلاه هي كما يلي:
رئيسي
الموضوع-0
الموضوع-1
كما يتبين من الإخراج أعلاه، فإن الإخراج الرئيسي في السطر الأول هو اسم الخيط الرئيسي. يعد Thread-1 وThread-2 التاليان نتائج إخراج Thread1 وthread2 على التوالي.
ملاحظة: يجب أن يحتوي أي برنامج جافا على موضوع رئيسي. بشكل عام، اسم هذا الموضوع الرئيسي هو main. فقط من خلال إنشاء سلاسل رسائل إضافية في البرنامج يمكن اعتباره برنامجًا حقيقيًا متعدد الخيوط. بمعنى آخر، يجب أن يحتوي البرنامج متعدد الخيوط على أكثر من مؤشر ترابط واحد.
تحتوي فئة Thread على مُنشئ محمّل بشكل زائد لتعيين اسم مؤشر الترابط. بالإضافة إلى استخدام طريقة المُنشئ لتعيين اسم مؤشر الترابط عند إنشاء مؤشر ترابط، يمكنك أيضًا استخدام طريقة setName لفئة مؤشر الترابط لتعديل اسم مؤشر الترابط. لتعيين اسم مؤشر الترابط من خلال مُنشئ فئة Thread، يجب عليك استخدام مُنشئ Thread(String name) العام لفئة Thread في فئة Thread الفرعية، لذلك، يجب عليك أيضًا إضافة مؤشر ترابط لتمرير مُنشئ اسم Thread . الكود التالي يعطي مثالاً لإعداد اسم الموضوع:
انسخ رمز الكود كما يلي:
الحزمة الأسطورية؛
الطبقة العامة Thread2 تمتد الموضوع
{
سلسلة خاصة من؛
تشغيل الفراغ العام ()
{
System.out.println(who + ":: + this.getName());
}
الموضوع العام 2 (سلسلة من)
{
ممتاز()؛
this.who = who;
}
الموضوع العام 2 (سلسلة من، اسم السلسلة)
{
سوبر (الاسم)؛
this.who = who;
}
الفراغ العام الثابت الرئيسي (String[] args)
{
Thread2 thread1 = new Thread2 ("thread1"، "MyThread1")؛
Thread2 thread2 = new Thread2 ("thread2");
Thread2 thread3 = new Thread2 ("thread3");
thread2.setName("MyThread2");
Thread1.start();
Thread2.start();
Thread3.start();
}
هناك نوعان من المنشئين في الفصل:
السطر 011: العينة العامة 2_2 (سلسلة من)
يحتوي هذا المنشئ على معلمة واحدة: من. يتم استخدام هذه المعلمة لتحديد مؤشر الترابط الذي تم إنشاؤه حاليًا. لا يزال يُستدعى المُنشئ الافتراضي للخيط public Thread() في هذا المُنشئ.
السطر 016: عينة عامة 2_2 (سلسلة من، اسم السلسلة)
من في هذا المنشئ له نفس معنى من في المنشئ الأول، ومعلمة الاسم هي اسم الخيط. في هذا المنشئ، يتم استدعاء مُنشئ Thread(String name) العام لفئة Thread، وهو super(name) في السطر 018.
يتم إنشاء ثلاثة خيوط في الطريقة الرئيسية: Thread1 وthread2 وthread3. من بينها، يقوم Thread1 بتعيين اسم الخيط من خلال طريقة الإنشاء، ويقوم Thread2 بتعديل اسم الخيط من خلال طريقة setName، ولا يقوم Thread3 بتعيين اسم الخيط.
نتائج التشغيل هي كما يلي:
انسخ رمز الكود كما يلي:
Thread1:MyThread1
Thread2:MyThread2
الموضوع 3: الموضوع 1
كما يتبين من الإخراج أعلاه، تم تعديل أسماء سلاسل الرسائل Thread1 وthread2، بينما لا يزال اسم مؤشر الترابط الخاص بـ thread3 هو القيمة الافتراضية: Thread-1. السبب وراء أن اسم مؤشر الترابط الخاص بـ Thread3 ليس Thread-2 ولكن Thread-1 هو أنه تم تحديد اسم Thread2 في السطر 026. لذلك، عند بدء تشغيل Thread3، يتم تعيين اسم مؤشر الترابط الخاص بـ Thread3 على Thread-1. لذلك سوف تحصل على الناتج أعلاه.
ملاحظة: يمكنك استخدام setName لتعيين اسم مؤشر الترابط قبل وبعد استدعاء أسلوب البدء، ومع ذلك، فإن استخدام setName لتعديل اسم مؤشر الترابط بعد استدعاء أسلوب البدء سيؤدي إلى عدم اليقين، مما يعني أنه قد لا يتم تنفيذ setName حتى يتم تشغيل أسلوب التشغيل. تم تنفيذه. إذا كنت تريد استخدام اسم مؤشر الترابط في طريقة التشغيل، فستكون هناك ظاهرة مفادها أنه على الرغم من استدعاء طريقة setName، لا يتم تعديل اسم مؤشر الترابط.
لا يمكن استدعاء أسلوب البدء لفئة Thread عدة مرات، على سبيل المثال، لا يمكن استدعاء الأسلوب thread1.start() مرتين. وإلا سيتم طرح IllegalThreadStateException.