هذه المقالة يدرس بشكل أساسي أمثلة رمز ذات صلة بتكنولوجيا الاتصالات التقليدية لمزامنة الخيط من التزامن Java ، على النحو التالي.
دعونا نلقي نظرة على سؤال أولاً:
هناك نوعان من المواضيع. ينفذ مؤشر ترابط الطفل 10 مرات أولاً ، ثم يتم تنفيذ مؤشر الترابط الرئيسي 5 مرات ، ثم ينفذ إلى مؤشر ترابط الطفل 10 ، ثم يتم تنفيذ مؤشر الترابط الرئيسي 5 مرات ... هذه الرحلة ذهابًا وإيابًا 50 مرة.
بعد قراءة هذا السؤال ، من الواضح أن الاتصال بين المواضيع يستخدم. اسمحوا لي أن أقوم بتحليل الفكرة أولاً: أولاً يجب أن يكون هناك خيطان ، ثم يجب أن يكون هناك 50 حلقات في كل مؤشر ترابط ، لأن كل مؤشر ترابط يجب أن يقوم بمهام ذهابًا وإيابًا بمقدار 50 مرة ، ومهمة الموضوع الرئيسي هي تنفيذ 5 مرات ، ومهمة مؤشر ترابط الطفل هي تنفيذ 10 مرات. تستخدم تقنية الاتصال بين الخيوط بشكل أساسي طريقة wait() وطريقة notify() . تتسبب طريقة Wait () في انتظار الخيط الحالي وإطلاق القفل. تشير طريقة notify() إلى أن مؤشر ترابط واحد ينتظر على شاشة الكائن هذا يستيقظ. دعنا نكتمل مشكلة الاتصال بين الخيطين خطوة بخطوة.
أولاً ، بغض النظر عن التواصل بين الخيط الرئيسي وخيط الطفل ، اكتب المهام ليتم تنفيذها بواسطة كل موضوع:
الفئة العامة traditionSreadCommunication {public static void main (string [] args) {// افتح مؤشر ترابط طفل جديد مؤشر ترابط جديد (جديد Runnable () {@override public run () {for (int i = 1 ؛ i <= 50 ؛ i ++) {synchronized (tradustralthreadcommunication.class) {system.out.println ("تسلسل مؤشر الترابط الفرعي من" +j +"، حلقة" +i) ؛}}}}). start () ؛ // الطريقة الرئيسية هي الموضوع الرئيسي لـ (int i = 1 ؛ i <= 50 ؛ i ++) {system.out.println ("تسلسل مؤشر الترابط الرئيسي لـ" + j + "، حلقة" + i) ؛}}}}}}}}}}}}}}}}}}}}كما ذكر أعلاه ، يحتوي كل من الخيوط على 50 حلقات كبيرة وتنفيذ 50 مهمة ، ويتم تنفيذ مهمة خيط الطفل 10 مرات ، ويتم تنفيذ مهمة الخيط الرئيسي 5 مرات. من أجل ضمان التزامن بين خيطين ، يتم استخدام كتل رمز التزامن المتزامنة ، ويتم استخدام نفس القفل: كائن Bytecode للفئة. هذا يضمن سلامة الموضوع. لكن هذا التصميم ليس جيدًا جدًا. تمامًا كما كتبت في حالة deadlock في القسم السابق ، يمكننا وضع مهام الخيوط في الفصل. نمط هذا التصميم أكثر تنظيماً ، وسيقوم بوضع مهام الخيوط المختلفة في نفس الفئة بسهولة حل مشكلة التزامن لأنه من السهل استخدام نفس القفل في الفصل. لذا قم بتعديل البرنامج أعلاه:
الطبقة العامة traditionSreadCommunication {public static void main (string [] args) {business business = new Business () ؛ مؤشر الترابط الرئيسي لـ (int i = 1 ؛ i <= 50 ؛ i ++) {bussiness.main (i) ؛}}} // يجب تصنيف البيانات الشائعة (بما في ذلك أقفال التزامن) أو عدة طرق شائعة يمكن استخدامها في نفس الفئة. يعكس هذا التصميم فقط متانة برنامج التجميع من الدرجة العالية. فئة الأعمال {public synchronized void sub (int i) {for (int j = 1 ؛ j <= 10 ؛ j ++) {system.out.println ("تسلسل الخيط الفرعي" +j +"، حلقة" +i) ؛}} systems system of therchronized (int i) {int j = 1 ؛ J + "، حلقة" + i) ؛}} بعد هذا التعديل ، يصبح بنية البرنامج أكثر وضوحًا وأكثر قوة. فقط أضف الكلمة الرئيسية المتزامنة إلى طريقتي مهمة مؤشر الترابط ، واستخدم هذا القفل. ولكن لا يوجد اتصال بين الخيوط حتى الآن. تتمثل نتيجة التنفيذ في أن الخيط الرئيسي يحلق المهمة 50 مرة ، وأن مؤشر ترابط الطفل يحلق المهمة 50 مرة. السبب بسيط للغاية ، لأن هناك تزامن متزامن.
يستمر ما يلي في تحسين البرنامج للسماح بالاتصال بين الخيوطين كما هو موضح في السؤال:
الطبقة العامة traditionSreadCommunication {public static void main (string [] args) {business business = new Business () ؛ مؤشر الترابط الرئيسي لـ (int i = 1 ؛ i <= 50 ؛ i ++) {bussiness.main (i) ؛}}} // لاستخدام البيانات الشائعة (بما في ذلك أقفال المزامنة) أو عدة طرق شائعة في نفس الفئة. يعكس هذا التصميم فقط متانة دراما Gao Lei والبرنامج. الفصل الدراسي {private boolean bshouldsub = true ؛ public void sub (int i) {بينما (! bshouldsub) {// إذا لم يكن دورك للتنفيذ ، فحاول {this.wait () ؛ // الكائن الذي يستدعي طريقة wait () نفسه مثل كائن القفل المتزامن. هنا متزامن على الطريقة ، لذلك استخدم هذا} catch (interruptedException e) {// todo catch blocke.printstacktrace () ؛}} لـ (int j = 1 ؛ j <= 10 ؛ j ++) this.notify () ؛ // استيقظ مؤشر الترابط الرئيسي الانتظار} الفراغ المتزامن العام (int i) {بينما (bshouldsub) {// إذا لم يكن دورك لتنفيذ ، حاول {this.wait () ؛ ++) {system.out.println ("تسلسل مؤشر الترابط الرئيسي لـ" + j + "، حلقة" + i) ؛} bshouldsub = true ؛ // تغيير العلامة this.notify () ؛ // استيقظ على مؤشر ترابط الطفل}}}بادئ ذي بدء ، دعونا لا نتحدث عن تنفيذ البرنامج المحدد ، من منظور هيكلي ، لقد أدركنا بالفعل فوائد هذا التصميم: ليست هناك حاجة لتعديل أي شيء في الوظيفة الرئيسية ، والمنطق حول التزامن بين الخيوط والتواصل بين الخيوط هو كل شيء في فئة الأعمال. تحتاج مؤشرات ترابط مختلفة في الوظيفة الرئيسية فقط إلى استدعاء المهام المقابلة الموضوعة في الفصل. إنه يعكس فوائد التدفق العالي.
دعونا نلقي نظرة على الكود المحدد مرة أخرى. أولاً ، حدد متغيرًا منطقيًا لتحديد الخيط الذي يجب تنفيذه. عندما لا يكون خيط الطفل ، فإنه سوف ينام. ثم سوف ينفذ بشكل طبيعي الخيط الرئيسي. بعد التنفيذ ، سيقوم بتعديل BShouldsub ويستيقظ خيط الطفل. في هذا الوقت ، سيحكم خيط الطفل على أنه على الرغم من عدم رضاه ولن ينام. سوف ينفذ مهمة موضوع الطفل. وبالمثل ، بعد تعديل الخيط الرئيسي للتو BShouldSub ، عند استخدام الحلقة الثانية لتنفيذ مهمة الخيط الرئيسية ، سوف ينام وينتظر أن يستيقظ خيط الطفل. هذا يجعل المنطق واضحا جدا. يتناوب الخيط الرئيسي وخيط الطفل لتنفيذ مهام كل منهما ، وهذا الإيقاع هو 50 مرة في المجموع.
هناك تفسير صغير آخر: من الممكن في الواقع استخدام إذا كان للحكم ، ولكن لماذا تستخدم أثناء استخدامه؟ لأنه في بعض الأحيان سوف تستيقظ الخيوط fakely (يشبه المشي نوم ، من الواضح أنه نائم ولكن يقف). إذا كان يستخدم إذا ، ثم بعد أن استيقظ فاكلي ، فلن يعود إلى الحكم إذا ، ثم سيتم تنفيذ المهمة بشكل طبيعي. حسنًا ، يتم تنفيذ موضوع آخر ، وسيؤثر على موضوع آخر في وميض. ولكن إذا كان ذلك بعض الوقت ، فسيكون الأمر مختلفًا. حتى لو كان الخيط مستيقظًا بشكل خاطئ ، فسيظل يحكم عليه. ومع ذلك ، فإن الخيط الآخر ينفذ في هذا الوقت. لم يتم تعديل BShouldSub ، لذلك لا يزال يدخل أثناء النوم مرة أخرى ~ لذلك فهو آمن للغاية ولن يؤثر على الخيط الآخر! ويتم ذلك أيضًا في وثيقة JDK الرسمية.
دعونا نلخص التواصل بين المواضيع.
ما ورد أعلاه هو كل التفسير التفصيلي لقواعد تكنولوجيا الاتصالات التقليدية لمزامنة الخيط التزامن Java ، وآمل أن يكون مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى الموضوعات الأخرى ذات الصلة على هذا الموقع. إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!