مفهوم Java Threading <BR /> على عكس معظم لغات الكمبيوتر الأخرى ، تدعم Java البرمجة المتعددة المؤشرات المدمجة في المدمجة.
يحتوي برنامج متعدد الخيوط على جزأين أو أكثر يعملان بشكل متزامن. يسمى كل جزء من هذا البرنامج مؤشر ترابط ، ولكل مؤشر ترابط مسار تنفيذ مستقل. لذلك ، تعدد القراءة هو شكل خاص من المهام المتعددة.
يجب أن تعرف تعدد المهام لأنه مدعوم بالفعل من قبل جميع أنظمة التشغيل الحديثة. ومع ذلك ، هناك نوعان متميزان من المهام المتعددة: القائمة على العملية والقائمة على الخيوط. من المهم جدًا فهم الاختلافات بين الاثنين.
بالنسبة للعديد من القراء ، يعد تعدد المهام القائمة على العملية شكلًا أكثر دراية. العملية هي في الأساس برنامج تنفيذ. لذلك ، تتميز تعدد المهام القائمة على العملية بالسماح لجهاز الكمبيوتر الخاص بك بتشغيل برنامجين أو أكثر في وقت واحد. على سبيل المثال ، تتيح لك تعدد المهام المستندة إلى العملية تشغيل برنامج التحويل البرمجي Java في وقت واحد أثناء استخدام محرر النصوص. في تعدد المهام القائمة على العملية ، يعد البرنامج أصغر وحدة من التعليمات البرمجية المعينة من قبل المجدول.
في بيئة تعدد المهام المستندة إلى خيوط ، تعد المواضيع أصغر وحدة تنفيذ. هذا يعني أن البرنامج يمكنه أداء وظائف لمهامتين أو أكثر في وقت واحد. على سبيل المثال ، يمكن لمحرر النص تنسيق النص أثناء الطباعة. لذلك ، تتعامل البرامج متعددة العمليات مع "الصور الكبيرة" ، في حين أن البرامج متعددة الخيوط تتعامل مع التفاصيل.
تتطلب البرامج المتعددة المراكز نفقات إدارية أقل من البرامج متعددة العمليات. العمليات هي مهام الوزن الثقيلة التي تتطلب مساحة عناوينها المستقلة. التواصل بين العمليات مكلفة ومقيدة. التحول بين العمليات هو أيضا مكلفة للغاية. المواضيع ، من ناحية أخرى ، هي لاعبين خفيف الوزن. يشاركون نفس مساحة العنوان ويشاركون نفس العملية معًا. التواصل بين الخيوط رخيصة ، والتحويل بين الخيوط منخفضة التكلفة أيضًا. عندما يستخدم برنامج Java بيئة معالجة المهام متعددة العمليات ، لا يتم التحكم في برنامج Java متعدد العمليات ، بينما يتم التحكم في Java Multi-ThrateChing.
يساعدك MultiThreading في كتابة برامج فعالة مع أقصى قدر من استخدام وحدة المعالجة المركزية ، حيث يتم الاحتفاظ بوقت الخمول إلى الحد الأدنى. هذا أمر بالغ الأهمية لبيئات التوصيل التفاعلية للشبكة التي تعمل في Java ، لأن وقت الفراغ عام. على سبيل المثال ، يكون معدل نقل بيانات الشبكة أقل بكثير من قدرة معالجة الكمبيوتر ، وسرعة القراءة والكتابة لموارد نظام الملفات المحلية أقل بكثير من وحدة المعالجة المركزية. . في بيئة واحدة تقليدية ، يجب أن ينتظر برنامجك كل مهمة لإكمالها قبل إجراء الخطوة التالية-على الرغم من أن وحدة المعالجة المركزية لديها الكثير من وقت الفراغ. يتيح لك Multithreading الحصول على أقصى استفادة من وقت الفراغ هذا والاستفادة منه.
نموذج خيوط Java
يعتمد نظام وقت تشغيل Java على مؤشرات الترابط بعدة طرق ، وتأخذ جميع تصميمات مكتبة الفصل في الاعتبار MultiThreading. في الواقع ، تستخدم Java مؤشرات الترابط لجعل البيئة بأكملها غير متزامنة. هذا يساعد على تقليل الجزء غير صالح عن طريق منع إهدار حلقات وحدة المعالجة المركزية.
لفهم مزايا بيئة متعددة مؤشرات الترابط بشكل أفضل ، يمكن مقارنتها مع أدوات التحكم. تتمثل طريقة المعالجة في نظام واحد متخلف في استخدام طريقة حلقة الحدث تسمى الاقتراع. في هذا النموذج ، يعمل التحكم المفرد في حلقة لا حصر لها ، مما يؤدي إلى استقصاء سلسلة من الأحداث لتحديد ما يجب القيام به بعد ذلك. بمجرد إرجاع جهاز الاقتراع إشارة إلى أن ملف الشبكة جاهز للقراءة ، يدير التحكم في جدولة حلقة الحدث إلى معالج الحدث المناسب. حتى يعود معالج الحدث ، لا توجد أحداث أخرى في النظام. هذا يضيع وقت وحدة المعالجة المركزية. يؤدي هذا إلى احتلال جزء من البرنامج على وجه الحصر ومنع تنفيذ الأحداث الأخرى. بشكل عام ، في بيئة واحدة من الخيوط ، عندما يتم كتل مؤشر الترابط (الكتل ، تعليق التنفيذ) أثناء انتظار الموارد ، يتوقف البرنامج بأكمله عن التشغيل.
ميزة Java Multihreading هي أنها تلغي آلية الحلقة/الاقتراع الرئيسية. يمكن إيقاف الموضوع دون التأثير على أجزاء أخرى من البرنامج. على سبيل المثال ، يمكن استخدام وقت الخمول الذي يتم إنشاؤه عندما يقرأ مؤشر ترابط البيانات من الشبكة أو ينتظر إدخال المستخدم في مكان آخر. يتيح Multithreading حلقة حية للنوم لمدة ثانية واحدة في كل فجوة في الإطار دون إيقاف النظام بأكمله. هناك انسداد مؤشر ترابط في برنامج Java ، ويتم تعليق موضوع واحد فقط ، وتستمر المواضيع الأخرى في التشغيل.
المواضيع موجودة في عدة حالات. يمكن تشغيل الموضوع. يمكن أن يعمل طالما تحصل على وقت وحدة المعالجة المركزية. يمكن تعليق الخيط الجري ومقاطعة تنفيذه مؤقتًا. يمكن استئناف الخيط المعلق ، مما يسمح له بالمتابعة من حيث توقف.
في أي وقت ، يمكن أن ينتهي الخيط ، والذي يقطع تشغيله على الفور. بمجرد إنهاء ، لا يمكن استعادة الخيط.
أولوية الموضوع
يعطي Java الأولوية لكل مؤشر ترابط لتحديد كيفية علاج الخيط بالمقارنة مع المواضيع الأخرى. أولوية الموضوع هي عدد صحيح يشرح علاقة الأولوية بين المواضيع. كقيمة مطلقة ، تكون الأولوية بلا معنى ؛ بدلاً من ذلك ، يتم استخدام أولوية مؤشر الترابط لتحديد متى يتم التبديل من مؤشر ترابط إلى آخر. وهذا ما يسمى "مفتاح السياق". القواعد التي تحدد حدوث تحويل السياق بسيط:
يمكن أن تتخلى المواضيع تلقائيًا عن التحكم. في حالة الإدخال/الإخراج غير المحددة ، يتم النوم أو الحظر عن طريق تنازلات صريحة. بموجب هذا الافتراض ، يتم اكتشاف جميع المواضيع الأخرى ويتم منح مؤشر ترابط الأولوية الأعلى جاهزًا للتشغيل إلى وحدة المعالجة المركزية.
يمكن استباق المواضيع بواسطة المواضيع ذات الأولوية العالية. في هذه الحالة ، لا يستسلم مؤشر الترابط ذي الأولوية المنخفضة بشكل نشط ، فإن المعالج مشغول أولاً - بغض النظر عن ما يفعله - يشغل المعالج الخيط العالي الأول. في الأساس ، بمجرد أن يتم تشغيل الخيط ذو الأولوية العالية ، فإنه ينفذ. وهذا ما يسمى تعدد المهام ذات الأولوية.
الموقف معقد بعض الشيء عندما يتنافس خيطان من نفس الأولوية لدورات وحدة المعالجة المركزية. بالنسبة لأنظمة التشغيل مثل Windows 98 ، تقسم مؤشرات الترابط ذات أولوية متساوية الوقت تلقائيًا في وضع الحلقة. بالنسبة لأنظمة التشغيل الأخرى ، مثل Solaris 2.x ، يتم التخلي عن مؤشرات الترابط ذات الأولوية تلقائيًا بالنسبة لأقرانها. إذا لم يكن هذا هو الحال ، فلن يتم تشغيل مؤشرات الترابط الأخرى.
تحذير: قد يؤدي تحويل سياق مؤشرات الترابط ذات الأولوية المنخفضة على أنظمة التشغيل المختلفة إلى توليد أخطاء.
التزامن
نظرًا لأن Multithreading تقدم سلوكًا غير متزامن في البرنامج ، يجب أن تكون هناك طرق لتعزيز التزامن عند الحاجة إليه. على سبيل المثال ، إذا كنت تريد أن تتواصل ترابطان مع بعضهما البعض ومشاركة بنية بيانات معقدة ، مثل سلسلة من القوائم المرتبطة ، فأنت بحاجة إلى طريقة للتأكد من عدم تعارضها مع بعضها البعض. أي أنه عليك منع مؤشر ترابط واحد من كتابة البيانات بينما يقوم مؤشر ترابط آخر بقراءة البيانات من القائمة المرتبطة. تحقيقًا لهذه الغاية ، تقوم Java بتنفيذ طريقة أخرى تعتمد على النموذج القديم لمزامنة العمليات: الشاشة. عملية الإدارة هي آلية تحكم تم تحديدها لأول مرة بواسطة Carhoare.
يمكنك التفكير في عملية الإدارة كمربع صغير يتحكم في موضوع واحد فقط. بمجرد دخول الخيط إلى أنبوب ، يجب أن تنتظر جميع الخيوط حتى يخرج الخيط من الأنبوب. وبهذه الطريقة ، يمكن استخدام الإدارة لمنع معالجة الموارد المشتركة من خلال خيوط متعددة.
تعتبر العديد من الأنظمة متعددة الخيوط عملية الإدارة ككائن يجب على البرنامج أن يشير إليه بوضوح وتشغيله. يوفر Java حلاً واضحًا. لا يوجد فئة "شاشة" ؛ بمجرد تضمين مؤشر ترابط في طريقة التزامن ، لا يمكن لأي مؤشر ترابط آخر استدعاء طريقة التزامن في نفس الكائن. يتيح لك ذلك كتابة رمز متعدد الخيوط واضح وموجز ، حيث أن دعم المزامنة مدمج للغة.
تسليم الرسائل
بعد تقسيم البرنامج إلى عدة مؤشرات ترابط ، تحتاج إلى تحديد الاتصال بين كل مؤشر ترابط. عند التخطيط في معظم اللغات الأخرى ، يجب عليك الاعتماد على نظام التشغيل لإنشاء اتصال بين الخيوط. هذا سيزيد بالتأكيد التكلفة. ومع ذلك ، توفر Java طريقة نظيفة ومنخفضة التكلفة للحديث بين MultiThreads - من خلال استدعاء الطرق المحددة مسبقًا التي تمتلكها جميع الكائنات. يسمح نظام المراسلة في Java لخيط إدخال طريقة متزامنة لكائن ثم الانتظار هناك حتى تقوم مؤشرات الترابط الأخرى بإخطاره بشكل صريح.
فئة الموضوع والواجهة القابلة للتشغيل
يعتمد نظام Java متعدد الخيوط على فئة مؤشرات الترابط وطرقه وواجهة الشركة المشتركة. تغلف فئة مؤشر الترابط تنفيذ مؤشرات الترابط. نظرًا لأنه لا يمكنك الرجوع مباشرةً إلى حالة مؤشر ترابط التشغيل ، يجب عليك معالجته من خلال الوكيل ، بحيث يتم إنشاء مثيل الخيط. لإنشاء مؤشر ترابط جديد ، يجب على البرنامج تمديد مؤشر الترابط أو تنفيذ واجهة Runnable.
تحدد فئة الموضوع عدة طرق للمساعدة في إدارة مؤشرات الترابط. يتم عرض الطرق المستخدمة في هذا الفصل في الجدول: