في هذه المقالة ، سوف نتحدث عن آلية مقاطعة Java مؤشر ترابط Java.
خيط المقاطعة
طريقة thread.Interrupt () من مؤشر الترابط هي مقاطعة الخيط. سيعين وضع حالة المقاطعة من مؤشر الترابط ، أي ، تم تعيينه على TRUE. ما إذا كان الخيط الذي تم مقاطعة يموت ، أو ينتظر مهمة جديدة أو يستمر في الركض إلى الخطوة التالية يعتمد على البرنامج نفسه. سيقوم الخيط باكتشاف علامة المقاطعة هذه من وقت لآخر لتحديد ما إذا كان ينبغي مقاطعة الخيط (ما إذا كانت علامة المقاطعة صحيحة). لا يقطع مؤشر ترابط تشغيل مثل طريقة الإيقاف.
تحديد ما إذا كان الخيط قد توقف
لتحديد ما إذا كان مؤشر ترابط قد أرسل طلب المقاطعة ، يرجى استخدام thread.currentThread (). iSinterrupted () طريقة (لأنها لن تقوم بمسح مجموعة العلم المقاطعة فورًا مباشرة بعد تعيين علامة الإقامة في مؤشر الترابط إلى صواب ، أي أنه لن يعين علامة المقاطعة على خطأ). بدلاً من ذلك ، لا تستخدم thread.Interrupted () method (سيتم مسح بتات العلم المقاطعة بعد أن يتم استدعاء الطريقة ، أي إعادة تعيين طريقة كاذبة) للحكم. فيما يلي طريقة المقاطعة للمعلومات عندما يكون في حلقة:
بينما (! thread.currentTherve (). isInterrupted () && المزيد من العمل للقيام به)
علم حالة المقاطعة
هناك الطرق التالية في آلية مقاطعة المقاطعة:
لذلك ، لا تقاطع آلية المقاطعة المقاطعة الخيط الحالي حقًا ، ولكن تغيير في ترميز المقاطعة. دعنا نختبرها بأمثلة أولاً.
يتم استخدام الفئة العامة interrupttest {// يتم استخدام الوقت المستهلك هنا لطباعة وقت طويل ثابت = 0 ؛ private static void resettime () {time = system.currentTimeMillis () ؛ } private static void printcontent (string content) {system.out.println (content + "time:" + (System.CurrentTimeMillis () - time)) ؛ } public static void main (string [] args) {test1 () ؛ } private static void test1 () {thread1 thread1 = new thread1 () ؛ thread1.start () ؛ // مقاطعة المقاطعة بعد 3 ثوان من التأخير حاول {thread.sleep (3000) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } thread1.interrupt () ؛ PrintContent ("مقاطعة التنفيذ") ؛ } private static class Thread1 يمتد Thread {Override public void run () {resettime () ؛ int num = 0 ؛ بينما (صواب) {if (iSInterrupted ()) {printContent ("مؤشر الترابط الحالي isIntredreded") ؛ استراحة؛ } num ++ ؛ if (num ٪ 100 == 0) {printContent ("num:" + num) ؛ }}}}}}}يتمثل الرمز أعلاه في بدء تشغيل مؤشر ترابط 1 ، وإضافة 1 إلى Num بشكل مستمر في حلقة There of thread1 ، وطباعته بمجرد كل مضاعف 100 (منع الطباعة من بسرعة كبيرة). ثم ، بعد النوم لمدة 3000 ميلي ثانية ، يستدعي الخيط الرئيسي طريقة المقاطعة لخيط Thread1. ثم دعونا نلقي نظرة على الإخراج:
مقاطعة مقاطعة
يمكن أن نرى أنه بعد تناول حوالي 3000 ميلي ثانية ، أي بعد نوم الخيط الرئيسي ، يتوقف مؤشر الترابط 1 ، ويتوقف مؤشر ترابط Thread1 لأن الطريقة المتقطعة في الحلقة تُرجع صحيحًا ، لذا فإن الكسر يخرج من الحلقة. وهذا يعني أن دور المقاطعة والمنقطع هنا يعادل دور setxx و getxx ، مع الحفاظ على متغير منطقي.
مقاطعة الاستثناء معالجة
بطبيعة الحال ، فإن آلية المقاطعة ليست مجرد تغيير واكتشاف بتات حالة المقاطعة ، بل يمكنها أيضًا التعامل مع استثناءات المقاطعة. نحن نعلم أن طريقة thread.sleep () تحتاج إلى التقاط استثناء المقاطعة ، لذلك دعونا نضيف تأخير نوم وتجربته
بينما (صواب) {if (iSInterrupted ()) {printContent ("مؤشر الترابط الحالي isIntredreded") ؛ استراحة؛ } num ++ ؛ // sleep try {thread.sleep (1) ؛ } catch (interruptedException e) {E.PrintStackTrace () ؛ } if (num ٪ 100 == 0) {printContent ("num:" + num) ؛ }}دعونا نلقي نظرة على نتيجة الإخراج:
مقاطعة مقاطعة
سنجد هنا أنه بعد النوم ، تكون قيمة NUM الإخراج أصغر بكثير (تصل العدد إلى مليار عندما لا ينامون ، ويبدو أن وحدة المعالجة المركزية تؤدي عمليات بسيطة بسرعة كبيرة). هاها ، ولكن هذه ليست النقطة. النقطة المهمة هي أنه بعد استثناء الإخراج ، يعود الإخراج IsInterrupted الخاطئ ، ويستمر مؤشر ترابط Thread1 في التنفيذ ، ولا يخرج من الحلقة. فلماذا هذا؟ لقد أضفنا فقط نومًا.
إذا كانت هناك عملية في مؤشر ترابط Thread1 تحتاج إلى التقاط استثناء من المقاطعات ، مثل نوم الخيط ، وطريقة الانضمام ، وانتظار الكائن ، وانتظار الشرط ، وما إلى ذلك ، فإنه يفرض استثناء من المقاطعات على الصيد ، ثم عند استثناء طريقة الترابط 1. ، فإنه سوف يرمي استثناء من interruptedException إلى مؤشر الترابط 1. ثم في حلقة بينما ، يمكن اكتشاف هذا الاستثناء وبعد ذلك بعد إلقاء هذا الاستثناء ، سيتم إعادة تعيين علامة مقاطعة مؤشر الترابط على الفور. لذلك ، عندما يتم تقطيعها في المرة التالية ، يتم تحديد حلقة بينما تكون خاطئة ، فلن تنكسر ، وبعد ذلك ستستمر الحلقة في التنفيذ.
لذلك ، ستقوم طريقة المقاطعة () بإجراء عمليات مختلفة بناءً على ما إذا كان هناك رمز في طريقة التشغيل في مؤشر ترابط الخيط الذي يجب أن يمسك بـ InterruptedException:
سيناريوهات التطبيق للمقاطعة
عادة ما تكون المقاطعة مناسبة لأحكام علامة الحلقة في تنفيذ مؤشرات الترابط ، على سبيل المثال
بينما (! isInterrupted ()) {...} ومع ذلك ، إذا كان هناك انسداد في هذه الحلقة ، فلا يمكن للمعلومات الحكم على العلامة المتقطعة التالية ، وحتى إذا تم استدعاء طريقة المقاطعة () ، فلن تتمكن من الخروج من الحلقة ، ولا يمكن للموضوع الخروج. على سبيل المثال
بينما (! isInterrupted ()) {... بينما (صحيح) {// تمسك مؤشر الترابط هنا ، لا يمكن الرد على الآلية المقاطعة على}}وبهذه الطريقة ، ستكون المقاطعة عاجزة ، وسيستمر الخيط في التنفيذ ولن يتم مقاطعة وتوقف.
أمثلة اختبار لعرض github-Javatest
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.