فهم المواضيع
مفهوم
الموضوع هو مؤشر ترابط التنفيذ في البرنامج. يتيح جهاز Java Virtual للتطبيقات تشغيل مؤشرات ترابط تنفيذ متعددة بشكل متزامن.
ميزات الموضوع
لديه حالة ، والتي تمثل حالة الخيط. في الوقت نفسه ، يحتوي الخيط في JVM على دولة واحدة فقط ؛
·جديد
المواضيع التي لم يتم البدء بعد (مؤشرات الترابط التي لم تبدأ منذ بدء تشغيل البرنامج)
・ Runnable
خيط قابل للتشغيل يعمل في JVM ، لكنه قد ينتظر موارد أخرى ، مثل وحدة المعالجة المركزية.
・ محظور
حظر الخيط ، في انتظار قفل للسماح له بمواصلة التشغيل
·منتظر
انتظر Infinite (قم بالتشغيل مرة أخرى على مؤشر ترابط يعتمد على السماح له بالدخول إلى تلك الحالة لإجراء عملية محددة)
timed_waiting
الانتظار المحدد (قم بالتشغيل مرة أخرى على موضوع يعتمد على السماح له بالدخول إلى هذه الحالة لعملية محددة في وقت انتظار محدد)
・ إنهاء
موضوع الخروج
لها الأولوية وتحديد ترتيب تنفيذ المواضيع ؛
عدد صحيح بين 1 و 10 ، والقيمة الافتراضية هي 5. كلما ارتفعت القيمة ، زادت فرصة التنفيذ ، والأولوية لا تحدد ترتيب تنفيذ مؤشر الترابط.
أولوية مؤشر ترابط الطفل هي نفس مؤشر ترابط الأصل بشكل افتراضي.
لاحظ أن JVM سيتوقف عن تنفيذ جميع المواضيع عندما:
يتم استدعاء طريقة EXIT () في وقت التشغيل (وقت التشغيل) ويتم السماح بالدعوة من الطريقة من قبل مدير الأمن ؛
توقفت جميع "الخيوط غير الدائرية" عن الجري (بغض النظر عما إذا كانت تتوقف بشكل طبيعي أو توقف) ؛
يمكن تمييزها كخفي (شيطان)
لا يزال خيط الطفل لخيط الخفي هو خيط الخفي.
يعد مؤشر ترابط Daemon أيضًا "مؤشر ترابط الخلفية" ، والذي يستخدم عمومًا لتنفيذ مهام الخلفية ، بينما يقوم مؤشر ترابط المستخدم عمومًا بتنفيذ مهام مستوى المستخدم.
طرق إنهاء الموضوع
1. استخدم علامة الخروج لجعل مخرج مؤشر الترابط بشكل طبيعي ، أي أن الخيط ينتهي بعد اكتمال طريقة التشغيل.
عند تنفيذ طريقة التشغيل ، سيتم الخروج من الخيط. ولكن في بعض الأحيان لا تنتهي طريقة التشغيل أبدًا. على سبيل المثال ، استخدام مؤشرات الترابط للاستماع إلى طلبات العميل في برامج الخادم ، أو المهام الأخرى التي تتطلب معالجة الحلقة. في هذه الحالة ، عادة ما يتم وضع هذه المهام في حلقة ، مثل أثناء الحلقة. إذا كنت تريد تشغيل الحلقة إلى الأبد ، فيمكنك استخدامها بينما (صحيح) {...} للتعامل معها. ومع ذلك ، إذا كنت ترغب في جعل الحلقة المخرج في حالة خروج في حالة معينة ، فإن الطريقة الأكثر مباشرة هي تعيين علامة نوع منطقية والتحكم في ما إذا كانت الحلقة تخرج عن طريق تعيين هذه العلامة إلى صواب أو خطأ. فيما يلي مثال على إنهاء مؤشر ترابط باستخدام علامة الخروج.
flagexitthread.java
package com.Rainmonth ؛/*** تم إنشاؤه بواسطة Randyzhang في 2017/3/23.
democlient.java
حزمة com.Rainmonth ؛/*** تم إنشاؤها بواسطة Randyzhang في 2017/3/23. new flagexitThread (flagexitThread.class.getSimplename ()) ؛ flagexitThread.start () ؛ حاول {thread.sleep (1000) ؛ flagexitthread.isexit = true ؛ {E.PrintStackTrace () ؛}} private void exitbyinterrupt () {flagexitthread flagexitthread = new flagexitthread (flagexitthread.class.getSimplename () ؛ system.out.println ( {thread.sleep (1500) ؛ system.out.println ("FlagexitThread interrupt ...") ؛ flagexitThread.Interrupt () ؛ thread.sleep (1500) ؛ system.out.println ("stop application ...") ؛} catch (interruptedException e) {نتيجة الإخراج:
اطبع حفنة من أنا أركض بعد خروج الموضوع.
2. استخدم طريقة التوقف لإنهاء مؤشر الترابط بقوة (لا ينصح هذه الطريقة ، لأن التوقف هو نفسه التعليق والاستئناف ، وقد يكون له أيضًا نتائج غير متوقعة).
تظهر طريقة استدعاء Stop (). وصف STOP () في الكود المصدر هو كما يلي:
/** هذه الطريقة غير آمنة بطبيعتها. يؤدي إيقاف مؤشر ترابط مع* thread.stop إلى إلغاء قفل جميع الشاشات التي تم قفلها (كنتيجة طبيعية للرسو* <code> ThreadDeath </code> استثناء نشر المكدس). إذا كانت* أي من الكائنات المحمية مسبقًا من قبل هذه الشاشات كانت في حالة غير متناسقة ، تصبح الكائنات التالفة مرئية لـ* مؤشرات ترابط أخرى ، مما يؤدي إلى سلوك تعسفي. يجب استبدال العديد من استخدامات <code> STOP </code> برمز ببساطة* تعديل بعض المتغيرات للإشارة إلى أن مؤشر ترابط الهدف يجب أن يتوقف عن تشغيله. يجب أن يتحقق مؤشر ترابط الهدف من هذا المتغير* بانتظام ، والعودة من طريقة التشغيل الخاصة به بطريقة منظمة* إذا كان المتغير يشير إلى أنه هو التوقف عن التشغيل. إذا كان مؤشر ترابط الهدف* ينتظر لفترات طويلة (على متغير الحالة ،* على سبيل المثال) ، يجب استخدام طريقة <code> المقاطعة </code> لتقطيع الانتظار.*/
المعنى العام هو أن انعدام الأمن للطريقة متأصلة. سيؤدي استدعاء STOP () لإنهاء مؤشر ترابط إلى إصدار جميع الشاشات التي تم قفلها (سيؤدي ذلك إلى انتشار استثناء ThreadDeath لأعلى على طول المكدس ليتم إلقاؤه). إذا كان هناك تناقض في الكائنات المحمية مسبقًا من قبل هذه الشاشات التي تم إصدارها ، تكون هذه الكائنات مرئية لخيوط أخرى ، فسيؤدي ذلك إلى بعض العواقب غير المتوقعة. ما ينبغي استبدال عمليات إيقاف رمز لا يحتاج إلا إلى تعديل رمز معين للإشارة إلى أن مؤشر ترابط الهدف يجب أن يتوقف عن التشغيل (الطريقة 1 بهذه الطريقة). إذا كان مؤشر الترابط الهدف ينتظر شرطًا معينًا (مثل متغير شرط معين) لفترة طويلة ، فيجب علينا استخدام طريقة المقاطعة لمقاطعة الانتظار (هذه هي طريقة الطريقة 3).
3. استخدم طريقة المقاطعة لمقاطعة الخيط.
تعني المقاطعة حرفيًا الانتهاء ، ولكن لا تحاول إنهاء مؤشر الترابط عن طريق استدعاء المقاطعة ، لأنه في بعض الأحيان حتى لو اتصلت بالطريقة ، سيستمر مؤشر الترابط في التنفيذ. يمكنك التعليق على exitbyflag () أعلاه ، وتمكين طريقة exitbyinterrupt () ، وتجد أن طريقة المقاطعة () تسمى في الوقت ، وأنا أقوم بتشغيل ... (قد تكون نتائج الأنظمة المختلفة ووحدات المعالجة المركزية مختلفة). يمكن ملاحظة أنه ليس من الآمن استخدام طريقة المقاطعة.
لخص
وفقًا للتحليل أعلاه ، فإن الطريقة الأكثر موصى بها هي الطريقة الأولى. يمكننا تعيين الأعلام باستخدام المتغيرات المشتركة وإرسال إشارات لإبلاغ الموضوع الذي يجب إنهاءه. بالطبع ، يجب علينا التأكد من أن عمليات هذا المتغير المشترك متزامن.
ما ورد أعلاه هو كل محتوى هذه المقالة حول مثيل مؤشر ترابط Java إنهاء وقراءة رمز مصدر STOP (). آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!