تتبع هذه المقالة المقالة السابقة "شرح مفصل لأمثلة Java MultiThreading (I)".
4. حالة الحظر والخيط السيطرة على جافا multithreads
تم ذكر عدة أنواع محددة من حظر Java أعلاه. دعنا نلقي نظرة على الطرق الرئيسية التي تسبب انسداد مؤشر ترابط Java.
1. الانضمام ()
انضم - دع مؤشر ترابط واحد ينتظر إكمال مؤشر ترابط آخر قبل الاستمرار في التنفيذ. إذا تم استدعاء الموضوع A في طريقة Join () لرسائل BHING B في هيئة تنفيذ مؤشرات الترابط ، يتم حظر مؤشر الترابط A وفقط بعد أن أكمل مؤشر الترابط B تنفيذ مؤشر الترابط B ، يمكن أن يستمر A في التنفيذ.
الفئة العامة twhertest {public static void main (string [] args) {myrunnable myrunnable = new myrunnable () ؛ موضوع الموضوع = موضوع جديد (myrunnable) ؛ لـ (int i = 0 ؛ i <100 ؛ i ++) {system.out.println (thread.currentThRead (). getName () + "" + i) ؛ if (i == 30) {thread.start () ؛ حاول {thread.join () ؛ // يحتاج مؤشر الترابط الرئيسي إلى الانتظار حتى يتم تنفيذ مؤشر ترابط مؤشر ترابط قبل الاستمرار في التنفيذ} catch (interruptedException e) {E.PrintStackTrace () ؛ }}}}}}}}}}}}}}}}}}}}}}}}}2.Sleep ()
النوم - دع مؤشر الترابط الذي ينفذ حاليًا قد توقف الوقت المحدد وأدخل حالة الحظر. خلال الفترة الزمنية التي ينام فيها ، لن يحصل الخيط على فرصة للتنفيذ لأنه ليس في الحالة الجاهزة. حتى لو لم تكن هناك مؤشرات ترابط قابلة للتنفيذ أخرى في النظام في هذا الوقت ، فلن يتم تنفيذ المواضيع في Sleep (). لذلك ، غالبًا ما يتم استخدام طريقة النوم () لإيقاف تنفيذ مؤشر الترابط.
كما ذكرنا سابقًا ، عندما يتم استدعاء طريقة START () للخيط الذي تم إنشاؤه حديثًا ، يدخل مؤشر الترابط إلى الحالة الجاهزة وقد يحصل على شريحة وقت وحدة المعالجة المركزية في وقت ما للتنفيذ. إذا كنت تريد تنفيذ مؤشر الترابط الجديد على الفور بضرورة معينة ، فما عليك سوى الاتصال بالنوم (1) من الخيط الأصلي مباشرة.
الفئة العامة twhertest {public static void main (string [] args) {myrunnable myrunnable = new myrunnable () ؛ موضوع الموضوع = موضوع جديد (myrunnable) ؛ لـ (int i = 0 ؛ i <100 ؛ i ++) {system.out.println (thread.currentThRead (). getName () + "" + i) ؛ if (i == 30) {thread.start () ؛ حاول {thread.sleep (1) ؛ // تأكد من تنفيذ مؤشر الترابط على الفور} catch (interruptedException e) { }}}}}}}}}}}}}}}}}}}}}}}}}ملاحظة: إن النوم لمدة ميلي ثانية واحدة كافية ، لأن وحدة المعالجة المركزية لن تكون خامدة وستتحول إلى الخيط الذي تم إنشاؤه حديثًا.
3. موضوع الخلفية (خيط Daemon)
المفهوم/الغرض: تقدم مؤشرات ترابط الخلفية الخدمات بشكل أساسي لخيوط أخرى (تسمى نسبياً مؤشرات الترابط الأمامي) ، أو "مؤشرات الترابط الخفي". مثل خيط مجموعة القمامة في JVM.
دورة الحياة: ترتبط دورة حياة خيط الخلفية بدورة حياة الخيط الأمامي. ينعكس بشكل أساسي في: عندما تدخل جميع مؤشرات الترابط المقدمة إلى الحالة الميتة ، سوف يموت مؤشر ترابط الخلفية تلقائيًا (في الواقع ، من السهل فهم هذا ، لأن الغرض من موضوع الخلفية هو خدمة الخيط الأمامي. نظرًا لأن جميع المواضيع الأمامية قد ماتت ، ما هو استخدامه لا يزال رائعًا!!).
تعيين مؤشر ترابط الخلفية: يمكن استدعاء طريقة setDaemon (TRUE) لكائن مؤشر الترابط تعيين مؤشر الترابط المحدد كخيط خلفية.
الفئة العامة twhertest {public static void main (string [] args) {thread mythread = new MyThread () ؛ لـ (int i = 0 ؛ i <100 ؛ i ++) {system.out.println ("thread main i ="+i) ؛ if (i == 20) {mythread.setDaemon (true) ؛ mythread.start () ؛ }}}}} class myThread يمتد Thread {public void run () {for (int i = 0 ؛ i <100 ؛ i ++) {system.out.println ("i ="+i) ؛ حاول {thread.sleep (1) ؛ } catch (interruptedException e) {// todo catch catch e.printstacktrace () ؛ }}}}حدد ما إذا كان مؤشر الترابط هو مؤشر ترابط الخلفية: اتصل بالطريقة ISDeamon () لكائن مؤشر الترابط.
ملاحظة: يعد مؤشر الترابط الرئيسي هو مؤشر ترابط المقدمة افتراضيًا ، وهو مؤشر ترابط الطفل الذي تم إنشاؤه في إنشاء مؤشر ترابط المقدمة هو مؤشر ترابط المقدمة افتراضيًا ، والخيط الذي تم إنشاؤه في مؤشر ترابط الخلفية هو مؤشر ترابط الخلفية افتراضيًا. عند استدعاء طريقة setDeamon (true) لتعيين مؤشر ترابط المقدمة كخيط خلفية ، يجب أن يكون قبل أن يتم استدعاء طريقة Start (). بعد وفاة الخيوط في اليوم السابق أمس ، يخطر JVM خيط الخلفية للموت ، لكن الأمر يستغرق وقتًا معينًا من تلقي التعليمات إلى الاستجابة.
4. تغيير أولوية المواضيع/setPriority ():
كل مؤشر ترابط له أولوية معينة عند التنفيذ ، والموضوعات ذات الأولوية العالية لديها المزيد من فرص التنفيذ. كل مؤشر ترابط له نفس الأولوية مثل الخيط الذي أنشأه. الخيط الرئيسي له أولوية طبيعية بشكل افتراضي.
تعيين أولوية موضوع: setPriority (int prioritylevel). يتراوح نطاق أولوية أولوية المعلمة بين 1-10 ، والقيم الثابتة الثابتة الثابتة التي تستخدم عادةً هي كما يلي:
max_priority: 10
min_priority: 1
norm_priority: 5
احصل على أولوية الموضوع: getPriority ().
ملاحظة: يعني كائن مؤشر ترابط ذي أولوية ترابط أعلى فقط أن هذا الموضوع لديه المزيد من فرص التنفيذ ، بدلاً من تنفيذ الأولوية.
الفئة العامة twhertest {public static void main (string [] args) {thread mythread = new MyThread () ؛ لـ (int i = 0 ؛ i <100 ؛ i ++) {system.out.println ("thread main i ="+i) ؛ if (i == 20) {mythread.setPriority (thread.max_priority) ؛ mythread.start () ؛ }}}}} class myThread يمتد Thread {public void run () {for (int i = 0 ؛ i <100 ؛ i ++) {system.out.println ("i ="+i) ؛ }}}5. تنازلات الموضوع: العائد ()
تمت مناقشة الدور الأساسي للعائد () في منشور المدونة السابق. في الوقت نفسه ، ترتبط طريقة العائد () أيضًا بأولوية الخيط. عندما يستدعي مؤشر ترابط طريقة eiled () للتبديل من حالة التشغيل إلى الحالة الجاهزة ، ستقوم وحدة المعالجة المركزية فقط بتحديد مؤشرات الترابط بنفس الأولوية أو أولوية أعلى مثل مؤشر الترابط من قائمة انتظار مؤشر ترابط الحالة جاهزة للتنفيذ.
الفئة العامة twhertest {public static void main (string [] args) {thread myThread1 = new MyThread1 () ؛ الموضوع myThRead2 = جديد myThread2 () ؛ myThread1.setPriority (thread.max_priority) ؛ mythread2.setPriority (thread.min_priority) ؛ لـ (int i = 0 ؛ i <100 ؛ i ++) {system.out.println ("thread main i ="+i) ؛ if (i == 20) {mythread1.start () ؛ mythread2.start () ؛ thread.yield () ؛ }}}}} class myThread1 يمتد Thread {public void run () {for (int i = 0 ؛ i <100 ؛ i ++) {system.out.println ("mythread 1 - i ="+i) ؛ }}} class myThread2 يمتد Thread {public void run () {for (int i = 0 ؛ i <100 ؛ i ++) {system.out.println ("mythread 2 - i ="+i) ؛ }}}سلسلة من المقالات:
شرح مثيلات جافا متعددة الخيوط (ط)
شرح مفصل للحالات متعددة الخيوط Java (II)
شرح مفصل للحالات متعددة الخيوط Java (III)