طريقة المقاطعة
تعني المقاطعة حرفيًا المقاطعة، ولكن في Java، تقوم طريقة Thread.interrupt() بإعلام الخيط بطريقة ما ولا تنهي الخيط مباشرة. الأمر متروك للشخص الذي كتب الكود ليقرر ما يجب فعله، وعادة ما نقوم بإلغاء الموضوع.
إذا كان مؤشر الترابط يستدعي طريقة الانتظار () أو الانتظار (طويل) أو الانتظار (طويل، int) لفئة الكائن، أو الانضمام ()، أو الانضمام (طويل)، أو الانضمام (طويل، int)، أو النوم (طويل) أو تم حظر سكون الفئة (طويل، int) أثناء الطريقة، وسيتم مسح حالة المقاطعة الخاصة بها، وستتلقى أيضًا InterruptedException.
إذا كانت كتل الخيط في عملية إدخال/إخراج على قناة قابلة للمقاطعة (java.nio.channels.InterruptibleChannel)، فسيتم إغلاق القناة، وسيتم تعيين حالة مقاطعة الخيط وسيتلقى الخيط ClosedByInterruptException.
إذا تم حظر الخيط في محدد (java.nio.channels.Selector)، فسيتم تعيين حالة مقاطعة الخيط وسيعود فورًا من عملية التحديد، ربما بقيمة غير صفرية، كما لو كان التحديد يسمى التنبيه طريقة الجهاز هي نفسها
إذا لم يتم حفظ أي من الشروط السابقة، فسيتم تعيين حالة مقاطعة الخيط.
ليس لمقاطعة مؤشر الترابط غير النشط أي تأثير.
كشف المقاطعة
تعتمد كيفية اكتشاف المقاطعة على ما يفعله مؤشر الترابط.
إذا كان مؤشر الترابط يستدعي طريقة يمكنها طرح InterruptException، فالتقط InterruptException ثم تعامل معه في كتلة الالتقاط (عادةً ما يتم الخروج من طريقة التشغيل لمقاطعة مؤشر الترابط)
إذا قمت باستدعاء طرق أخرى، يمكنك التحقق من Thread.interrupted عندما يكون خاملاً لتحديد ما إذا كان قد تم استلام إشارة المقاطعة، ومعالجتها بعد التأكد من تلقي إشارة المقاطعة. يمكن طرح InterruptException ليكون متوافقًا مع طريقة المعالجة السابقة
حالة المقاطعة
يتم تنفيذ آلية مقاطعة الخيط باستخدام العلامة الداخلية لحالة المقاطعة. يتم تعيين حالة المقاطعة عند استدعاء طريقة المقاطعة () الخاصة بمؤشر الترابط (راجع وصف طريقة المقاطعة أعلاه).
هناك طريقتان للحصول على حالة المقاطعة لمؤشر الترابط:
استدعاء الأسلوب الثابت Thread.interrupted() بالإضافة إلى إرجاع حالة المقاطعة لمؤشر الترابط الحالي، تقوم هذه الطريقة أيضًا بمسح حالة المقاطعة لمؤشر الترابط الحالي. بمعنى آخر، إذا تم استدعاء هذه الطريقة مرتين على التوالي، فسيعود الاستدعاء الثاني خطأ (بعد أن قامت المكالمة الأولى بمسح حالة المقاطعة، وقبل أن يتحقق الاستدعاء الثاني من حالة المقاطعة، تتم مقاطعة مؤشر الترابط الحالي مرة أخرى. الاستثناءات ).
استدعاء أسلوب isInterrupted () للخيط المحدد. تقوم هذه الطريقة بإرجاع حالة المقاطعة للخيط المحدد فقط دون التأثير على حالة المقاطعة للخيط.
هناك طريقتان لمسح حالة المقاطعة لسلسلة رسائل:
كما ذكر أعلاه، استدعاء Thread.interrupted()
عندما يتم استدعاء أسلوب المقاطعة () لمؤشر الترابط لإحداث InterruptedException، يتم مسح حالة المقاطعة لمؤشر الترابط في نفس الوقت، بما في ذلك طريقة الانتظار () أو الانتظار (طويل) أو الانتظار (طويل، int) للكائن class، أو طريقة join () للخيط، أو join(long)، أو join(long، int) ، أو Sleep(long) أو طريقة Sleep(long, int)