في بعض الأحيان يكون معلقة الخيط مفيدة. على سبيل المثال ، يمكن استخدام مؤشر ترابط منفصل لعرض وقت اليوم. إذا كان المستخدم لا يريد استخدام الساعة ، فسيتم تعليق الخيط. في أي حال ، يكون تعليق الخيط بسيطًا للغاية ، وبمجرد تعليقه ، يعد إعادة تشغيل الخيط أمرًا بسيطًا أيضًا.
تختلف آليات تعليق الخيوط وإنهائها واستعادتها في الإصدارات Java 2 والإصدارات السابقة. على الرغم من أنك تستخدم Java 2 لكتابة الرمز ، إلا أنك لا تزال بحاجة إلى فهم كيفية القيام بهذه العمليات في بيئة Java المبكرة. على سبيل المثال ، قد تحتاج إلى تحديث أو الحفاظ على الرمز القديم. تحتاج أيضًا إلى فهم سبب وجود مثل هذه التغييرات. لهذه الأسباب ، يصف ما يلي الطريقة الأصلية لتنفيذ التحكم في مؤشر الترابط ، تليها طريقة Java 2.
وقفة واسترداد وإنهاء المواضيع في جافا 1.1 أو قبل ذلك
قبل إصدار Java2 ، يستخدم البرنامج تعليقًا محددًا من مؤشرات الترابط () واستئناف () لإيقاف مؤشرات الترابط وإعادة تشغيله. هم في شكل:
باطل النهائي () استئناف الفراغ النهائي ()
يصف الإجراء التالي هذه الطرق:
// باستخدام الاسم الخيط () Out .println ("موضوع جديد:" + T) ؛ i> 0 ؛ ":::::::::::::::::::::::::::::::::::::::::: :::::::::: NewthRead (One ") ؛ .sleep (1000) ؛ النوم (1000) ؛ انتظر threads try {system.out.println ("في انتظار أن تنتهي. println ("الموضوع الرئيسي المقاطع") ؛ جزء من إخراج البرنامج كما يلي:
موضوع جديد: موضوع [واحد ، 5 ، رئيسي] واحد: 15 نويو الموضوع: موضوع [اثنين ، 5 ، رئيسي] اثنان: 15 On: 14two: 14 On: 13two: 13 On: 12two: 11two: 11suspending Thread Onetwo: 10two: 9two: 8two: 8two: 7two: 6resuming Thread OneSuspending Thread twoe: 10 ONE: 9 ON: .
تحدد فئة الخيط أيضًا STOP () لإنهاء مؤشر الترابط. شكله كما يلي:
باطل توقف ()
بمجرد إنهاء الخيط ، لا يمكن استئنافه بواسطة السيرة الذاتية () لمواصلة التشغيل.
تعليق واستعادة وإنهاء المواضيع في جافا
يبدو أن أساليب التعليق () المعرفة من قبل الخيط () ، واستئناف () و Stop () هي طرق مثالية ومريحة لإدارة المواضيع ، ولا يمكن استخدامها في إصدارات جديدة من البرامج Java. فيما يلي الأسباب. لا يتم تفضيل طريقة التعليق () لفئة الخيط في Java2 ، لأن التعليق () قد يتسبب في بعض الأحيان في فشل النظام الخطيرة. على افتراض أن مؤشر ترابط لهيكل بيانات مهم ، إذا تم تعليق الخيط هناك ، فإن الخيوط المقفلة لا تتخلى عن التحكم في المورد. المواضيع الأخرى التي تنتظر هذه الموارد قد تكون مسدودة.
لم تتم الموافقة على طريقة السيرة الذاتية (). لا يسبب مشاكل ، ولكن لا يمكن استخدامه بشكل مستقل بدون طريقة التعليق (). تعارض طريقة STOP () لفئة الخيط أيضًا في Java 2. هذا لأن هذه الطريقة يمكن أن تسبب فشل في النظام الخطيرة. تخيل أن الخيط يكتب بنية بيانات دقيقة ومهمة واستكمال جزء واحد فقط منه. إذا أنهى الخيط في هذه اللحظة ، فقد يبقى بنية البيانات في حالة التعطل.
لأنه في Java 2 ، لا يمكن استخدام طرق التعليق () ، استئناف () و Stop () للتحكم في المواضيع ، قد تعتقد أنه لا توجد طريقة للتوقف واستعادة وإنهاء المواضيع. في الواقع ، هذا ليس هو الحال. بدلاً من ذلك ، يجب تصميم مؤشر الترابط بحيث تتحقق طريقة Run () بشكل دوري لتحديد ما إذا كان ينبغي تعليق الخيط أو استئناف أو إنهاء تنفيذه. تمثل ذلك ، يتم ذلك عن طريق إنشاء متغير علامة يشير إلى حالة الخيط. طالما تم تعيين العلم على "الجري" ، يجب أن تستمر تنفيذ طريقة Run () بواسطة مؤشر الترابط. إذا كان العلم "تعليق" ، فيجب إيقاف الموضوع. إذا تم ضبطها على "توقف" ، فيجب إنهاء الخيط.
بالطبع ، هناك العديد من الطرق لكتابة مثل هذا الرمز ، ولكن يجب أن يكون الموضوع المركزي هو نفسه لجميع البرامج.
توضح الأمثلة التالية كيف أن طرق Wait () وإخطار () موروثة من التحكم في الكائن في تنفيذ مؤشرات الترابط. هذا المثال مشابه جدًا للبرنامج المذكور سابقًا. ومع ذلك ، فإن أي من الطرق غير المعتمدة مفيدة. دعونا نفكر في تنفيذ البرنامج.
تحتوي فئة NewTread على متغير المثيل المستخدم المستخدم للتحكم في تنفيذ مؤشر ترابط. تتم تهيئتها إلى خطأ من قبل المنشئ. تحتوي طريقة RUN () على كتلة تراقب إعلان التزامن من SuperNdFlag. إذا كان المتغير صحيحًا ، فسيتم استدعاء طريقة Wait () لتعليق الخيط. طريقة mysuspend () تحدد SuperDflag إلى True. تقوم طريقة MyResume () بتعيين SuperNdFlag إلى false وتدعو طريقة الإخطار () لاستحضار الخيط. أخيرًا ، يتم تعديل الطريقة الرئيسية () للاتصال بطرق MySusPend () و MyResume ().
// تعليق وتسجيل مؤشر ترابط java2class Out .println ( T = 15 ؛ }} catch (InterruptedException e) {system.out.println (name + " void myresume () {suppendflag = false ؛ ؛ موضوع واحد ") ؛ ob2.mysuspend () ؛ system.out.println (" Thread Thread Two ") ؛ thread.sleep (1000) ؛ OB2.MyResume () ؛ System.out.println (" RESIMING THREAL T WO ") ؛ t.join () ؛ }إخراج هذا البرنامج هو نفسه من البرنامج السابق. في وقت لاحق من هذا الكتاب ، سترى المزيد من الأمثلة على استخدام آلية Java 2 للتحكم في المواضيع. على الرغم من أن هذه الآلية ليست "نظيفة" مثل الطريقة القديمة ، إلا أنها هي الطريقة لضمان عدم حدوث أي أخطاء في وقت التشغيل. إنها الطريقة التي يجب أن تتخذها جميع التعليمات البرمجية الجديدة.