تنفيذ مؤشرات الترابط المتعددة عن طريق وراثة فئة Thead:
المزايا: سهولة الكتابة إذا كنت بحاجة إلى الوصول إلى سلسلة المحادثات الحالية، فما عليك سوى استخدام هذا بدلاً من استخدام طريقة Thead.currentThread().
العيوب: نظرًا لأن فئة مؤشر الترابط هذه قد ورثت فئة Thead، فلا يمكنها أن ترث فئات أخرى.
رمز العينة:
انسخ رمز الكود كما يلي:
الحزمة org.frzh.thread;
الطبقة العامة FirstThread تمتد الموضوع {
كثافة العمليات الخاصة أنا؛
// أعد كتابة طريقة التشغيل. نص طريقة التشغيل هو نص تنفيذ الخيط.
تشغيل الفراغ العام () {
لـ (؛ أنا < 100؛ أنا ++) {
// عندما ترث فئة مؤشر الترابط فئة الموضوع، يمكنك الاتصال مباشرة بطريقة getName للحصول على اسم مؤشر الترابط الحالي.
// إذا كنت ترغب في الحصول على الخيط الحالي، استخدم هذا مباشرة
// تقوم طريقة getName لكائن Thread بإرجاع اسم مؤشر الترابط الحالي
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args) {
لـ (int i = 0; i < 100; i++) {
// اتصل بطريقة Thead's currentThread للحصول على الموضوع الحالي
System.out.println(Thread.currentThread().getName() + " " +i);
إذا (ط == 20) {
جديد FirstThread().start();
جديد FirstThread().start();
}
}
}
}
تشغيل مقتطف النتيجة:
وجدنا أن قيم i في الخيوط الفرعية ليست مستمرة، وهو ما يبدو متعارضا مع ما قلناه عن المشاركة المباشرة للبيانات من قبل الخيوط الفرعية. في الواقع، قمنا هنا بإنشاء مثيلين لموضوعين فرعيين، لكل منهما متغير المثيل الخاص به.
استخدام مؤشرات الترابط المتعددة التي تنفذ الواجهة القابلة للتشغيل:
المزايا: تنفذ فئة الخيط الواجهة القابلة للتشغيل فقط، لذا يمكنها أيضًا أن ترث فئات أخرى؛
في هذه الحالة، يمكن لخيوط متعددة مشاركة كائن مستهدف، لذلك من المناسب جدًا لخيوط متعددة معالجة نفس المورد، بحيث يمكن فصل وحدة المعالجة المركزية والتعليمات البرمجية والبيانات لتشكيل نموذج واضح وتفكير موجه للكائنات بشكل أفضل .
العيوب: البرمجة معقدة بعض الشيء إذا كنت تريد الوصول إلى مؤشر الترابط الحالي، فيجب عليك استخدام طريقة Thread.currentThread.
رمز العينة:
انسخ رمز الكود كما يلي:
الحزمة org.frzh.thread;
الطبقة العامة SecondThread تنفذ Runnable {
كثافة العمليات الخاصة أنا؛
@تجاوز
تشغيل الفراغ العام () {
// TODO طريقة تم إنشاؤها تلقائيًا stub
لـ (؛ أنا < 100؛ أنا ++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
public static void main(String[] args) {
لـ (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
إذا (ط == 20) {
SecondThread st = new SecondThread();
موضوع جديد (الأول، "الموضوع الفرعي 1").start();
new Thread(st, "child thread 2").start();
}
}
}
}
تشغيل مقتطف النتيجة:
يمكن ملاحظة أن قيمة i في هذا الوقت تتغير باستمرار لأن الخيطين 1 و 2 يشتركان في نفس الهدف.