تساعدك هذه المقالة على إتقان المعرفة الأساسية لـ Java Multithreading لتتوافق مع المشكلات التي تواجهها في المستقبل. المحتوى المحدد كما يلي
1. أسئلة مقابلة جافا متعددة الخيوط
1. ما هو الفرق بين العملية وخيط؟
العملية هي بيئة تشغيل محتوية على نفسها ، والتي يمكن اعتبارها برنامجًا أو تطبيقًا. الخيط هو مهمة يتم تنفيذها في عملية. بيئة وقت تشغيل Java هي عملية واحدة تحتوي على فئات وبرامج مختلفة. يمكن أن تسمى المواضيع عمليات خفيفة الوزن. تتطلب المواضيع موارد أقل لإنشاء وإقامة في هذه العملية ويمكنها مشاركة الموارد في هذه العملية.
2. ما هي فوائد البرمجة متعددة الخيوط؟
في برنامج متعدد الخيوط ، يتم تنفيذ مؤشرات ترابط متعددة بشكل متزامن لتحسين كفاءة البرنامج ، ولن تدخل وحدة المعالجة المركزية في حالة خاملة لأن مؤشر ترابط معين يحتاج إلى انتظار الموارد. تشترك مؤشرات الترابط المتعددة في ذاكرة الكومة ، لذا فإن إنشاء مؤشرات ترابط متعددة لأداء بعض المهام أفضل من إنشاء عمليات متعددة. على سبيل المثال ، Servlets أفضل من CGI لأن Servlets تدعم MultiThreading بينما CGI لا.
3. ما هو الفرق بين مؤشرات ترابط المستخدم وخيوط الخفي؟
عندما نقوم بإنشاء مؤشر ترابط في برنامج Java ، يطلق عليه مؤشر ترابط المستخدم. مؤشر ترابط الخفي هو مؤشر ترابط ينفذ في الخلفية ولا يمنع JVM المنتهية. عندما لا يتم تشغيل مؤشر ترابط مستخدم ، يقوم JVM بإغلاق البرنامج ويخرج. لا يزال خيط الطفل الذي تم إنشاؤه بواسطة خيط Daemon خيطًا خفيًا.
4. كيف ننشئ موضوعًا؟
هناك طريقتان لإنشاء مؤشرات الترابط: واحد هو تنفيذ الواجهة القابلة للتشغيل ، ثم تمريرها إلى مُنشئ مؤشرات الترابط ، وإنشاء كائن مؤشر ترابط ؛ والآخر هو ورث فئة الخيط مباشرة. لمزيد من المعلومات ، يمكنك قراءة هذه المقالة حول كيفية إنشاء مؤشرات الترابط في Java.
5. ما هي دورات حياة الخيوط المختلفة؟
عندما نقوم بإنشاء موضوع جديد في برنامج Java ، فإن حالته جديدة. عندما نسمي طريقة START () للمعلومات ، يتم تغيير الحالة إلى Runnable. يقوم مجدول مؤشر الترابط بتخصيص وقت وحدة المعالجة المركزية للمواضيع في تجمع الخيوط القابلة للتشغيل ويغير حالته إلى التشغيل. وتشمل حالات الخيوط الأخرى الانتظار ، المحظورة والموت. اقرأ هذه المقالة لمعرفة المزيد عن دورات حياة الخيط.
6. هل يمكنني استدعاء طريقة Run () مباشرة لفئة الخيط؟
بالطبع ، ولكن إذا نسمي طريقة Run () Thread ، فسوف يتصرف بنفس الطريقة الطبيعية. من أجل تنفيذ التعليمات البرمجية الخاصة بنا في مؤشر ترابط جديد ، يجب استخدام طريقة thread.start ().
7. كيف تتوقف عن موضوع قيد التشغيل لفترة من الوقت؟
يمكننا استخدام طريقة Sleep () لفئة الخيط لإيقاف الموضوع لفترة من الوقت. تجدر الإشارة إلى أن هذا لا يتسبب في إنهاء الخيط. بمجرد إيقاظ الخيط من السبات ، سيتم تغيير حالة الخيط إلى الجري ، ووفقًا لجدولة الخيط ، سيتم تنفيذها.
8. ما هو فهمك لأولوية الموضوع؟
كل موضوع له الأولوية. بشكل عام ، سيكون للخيوط ذات الأولوية العالية أولوية عند التشغيل ، ولكن هذا يعتمد على تنفيذ جدولة مؤشرات الترابط ، والذي يرتبط بنظام التشغيل (يعتمد OS). يمكننا تحديد أولوية مؤشرات الترابط ، لكن هذا لا يضمن تنفيذ مؤشرات الترابط ذات الأولوية العالية أمام المواضيع ذات الأولوية المنخفضة. أولوية الخيط هي متغير int (من 1-10) ، ويمثل 1 أدنى أولوية و 10 يمثل الأولوية القصوى.
9. ما هي جدولي الموضوع وتقطيع الوقت؟
جدولة مؤشرات الترابط هي خدمة نظام تشغيل مسؤولة عن تخصيص وقت وحدة المعالجة المركزية للمواضيع في حالة Runnable. بمجرد إنشاء مؤشر ترابط وبدء تشغيله ، يعتمد تنفيذها على تنفيذ جدولة مؤشرات الترابط. يشير Time Sharding إلى عملية تخصيص وقت وحدة المعالجة المركزية المتاحة للمواضيع المتاحة للتشغيل. يمكن أن يعتمد وقت وحدة المعالجة المركزية المخصصة على أولوية مؤشر الترابط أو وقت انتظار مؤشر الترابط. لا يتم التحكم في جدولة مؤشرات الترابط بواسطة أجهزة Java Virtual ، لذلك من الأفضل التحكم فيها من خلال التطبيق (أي ، لا تدع البرنامج يعتمد على أولويات الخيط).
10. في multithreading ، ما هو تبديل السياق؟
يعد تبديل السياق عملية تخزين واستعادة حالة وحدة المعالجة المركزية ، والتي تتيح تنفيذ مؤشرات الترابط من استئناف التنفيذ من نقاط المقاطعة. يعد تبديل السياق ميزة أساسية لأنظمة التشغيل متعددة المهام والبيئات متعددة الخيوط.
11. كيف تتأكد من أن الخيط الذي يوجد فيه طريقة () MAIN () هو الخيط الأخير الذي ينتهي في برنامج Java؟
يمكننا استخدام طريقة المفصل () لفئة مؤشرات الترابط للتأكد من أن جميع مؤشرات الترابط التي تم إنشاؤها بواسطة نهاية البرنامج قبل خروج الطريقة الرئيسية (). فيما يلي مقالة حول طريقة المفصل () لفئة الخيط.
12. كيف تتواصل المواضيع؟
عندما يمكن مشاركة الموارد بين الخيوط ، يعد التواصل بين الخيوط وسيلة مهمة لتنسيقها. يمكن استخدام طريقة WAIT ()/etreify ()/elefyall () في فئة الكائن للتواصل بين مؤشرات الترابط حول حالة الأقفال حول الموارد. انقر هنا لمزيد من المعلومات حول Thread Wait ، إخطار وإخطار.
13. لماذا يتم تحديد طرق اتصال الخيط () ، وعلم () وإخطار () محدد في فئة الكائن؟
يحتوي كل كائن في Java على قفل (شاشة ، والتي يمكن أن تكون أيضًا شاشة) و WAIT () ، يتم استخدام () وطرق أخرى لانتظار قفل الكائن أو إخطار كائنات مؤشرات الترابط الأخرى. لا توجد أقفال ومتزامنة متاحة لأي كائن لاستخدامه في مؤشرات ترابط Java. هذا هو السبب في أن هذه الطرق جزء من فئة الكائن ، بحيث يكون لكل فصل في Java طرقًا أساسية للتواصل بين الخيوط
14. لماذا يجب استدعاء () ، إخطار () وإخطار () في طريقة التزامن أو كتلة التزامن؟
عندما يحتاج مؤشر ترابط إلى استدعاء طريقة WAIT () للكائن ، يجب أن يكون لخيط قفل الكائن. ثم يطلق قفل الكائن ويدخل حالة الانتظار حتى تتصل مؤشرات الترابط الأخرى بطريقة الإخطار () على الكائن. وبالمثل ، عندما يحتاج مؤشر ترابط إلى استدعاء طريقة الإخطار () الكائن ، فإنه سيصدر قفل الكائن بحيث تنتظر الحصول على قفل الكائن. نظرًا لأن كل هذه الطرق تتطلب مؤشرات الترابط لعقد قفل الكائن ، لا يمكن تنفيذها إلا من خلال التزامن ، بحيث لا يمكن استدعاؤها إلا في طريقة التزامن أو كتلة التزامن.
15. لماذا أساليب النوم () و () من فئة الخيط ثابتة؟
سيتم تشغيل أساليب Sleep () و () من فئة الخيط على الخيط الذي ينفذ حاليًا. لذلك ليس من المنطقي استدعاء هذه الأساليب على مؤشرات الترابط الأخرى الموجودة في حالة انتظار. لهذا السبب هذه الطرق ثابتة. يمكنهم العمل في مؤشر الترابط الذي يتم تنفيذه حاليًا وتجنب الاعتقاد الخاطئ للمبرمج بأن هذه الأساليب يمكن استدعاؤها في مؤشرات الترابط الأخرى غير المقيدة.
16. كيف تضمن سلامة الموضوع؟
هناك العديد من الطرق لضمان سلامة مؤشرات الترابط في Java - التزامن ، واستخدام الفئات المتزامنة الذرية ، وتنفيذ الأقفال المتزامنة ، واستخدام الكلمات الرئيسية المتطايرة ، واستخدام فئات ثابتة وفئات آمنة. يمكنك معرفة المزيد في البرنامج التعليمي لسلامة الموضوع.
17. ما هو دور الكلمة الرئيسية المتطايرة في جافا؟
عندما نستخدم الكلمة الرئيسية المتطايرة لتعديل متغير ، سيقوم مؤشر الترابط بقراءة المتغير مباشرة ولا يقوم بتخزينه. هذا يضمن أن المتغيرات التي يقرأها الخيط متسقة في الذاكرة.
18. ما هو الخيار الأفضل ، طريقة التزامن أو كتلة التزامن؟
تعد الكتل المتزامنة خيارًا أفضل لأنه لن يغلق الكائن بأكمله (وبالطبع يمكنك أيضًا السماح له بإغلاق الكائن بأكمله). تقوم طريقة التزامن بإغلاق الكائن بأكمله ، حتى لو كانت هناك العديد من كتل المزامنة غير ذات صلة في الفئة ، والتي عادة ما تجعلهم يتوقفون عن التنفيذ والحاجة إلى الانتظار للحصول على القفل على الكائن.
19. كيف تخلق موضوع خفي؟
استخدم طريقة setDaemon (TRUE) لفئة مؤشر الترابط إلى طريقة setDaemon (TRUE) لتعيين مؤشر الترابط كخيط خفي. تجدر الإشارة إلى أنه يجب استدعاء هذه الطريقة قبل استدعاء طريقة START () ، وإلا سيتم طرح غير قانونية.
20. ما هو threadlocal؟
يتم استخدام ThreadLocal لإنشاء متغيرات محلية للمواضيع. نحن نعلم أن جميع مؤشرات ترابط الكائن ستشارك متغيراتها العالمية ، لذلك فإن هذه المتغيرات ليست آمنة مؤشرات الترابط ويمكننا استخدام تقنيات التزامن. ولكن عندما لا نريد استخدام التزامن ، يمكننا اختيار متغير threadlocal.
سيكون لكل مؤشر ترابط متغيرات مؤشر الترابط الخاصة بهم ، والتي يمكنها استخدام طريقة GET ()/SET () للحصول على قيمها الافتراضية أو تغيير قيمها داخليًا. عادةً ما تريد الحالات المرصوفة على ارتباطها بحالة الخيط كسمات ثابتة خاصة. في هذه المقالة ، يمكنك رؤية برنامج صغير حول ThreadLocal.
21. ما هي مجموعة الموضوع؟ لماذا لا ينصح؟
ThreadGroup هو فئة غرضها هو توفير معلومات حول مجموعات الخيوط.
واجهة برمجة تطبيقات ThreadGroup ضعيفة نسبيًا ، ولا تقدم ميزات أكثر من الخيط. لها وظيفتان رئيسيتان: إحداهما هي الحصول على قائمة من مؤشرات الترابط النشطة في مجموعة مؤشرات الترابط ؛ والآخر هو تعيين معالج استثناء غير معطل للمواضيع. ومع ذلك ، في Java 1.5 ، أضافت فئة مؤشرات الترابط أيضًا طريقة setuncaughtexceptionhandler (uncaughtexceptionHandler EH) ، وبالتالي فإن مجموعة الخيوط عفا عليها الزمن ولا ينصح بمواصلة استخدامه.
t1.setuncaughtexceptionHandler (new uncaughtexceptionHandler () {Override public void uncaughtexception (thread t ، rehable e) {system.out.println ("حدث الاستثناء:"+e.getMessage ()) ؛}}) ؛ 22. ما هو تفريغ موضوع جافا وكيفية الحصول عليه؟
تفريغ الخيط عبارة عن قائمة بخيوط JVM النشطة المفيدة جدًا لتحليل اختناقات النظام والكمال. هناك العديد من الطرق للحصول على تفريغ مؤشرات الترابط - باستخدام Profiler ، Kill -3 Command ، Jstack Tool ، وما إلى ذلك. أفضل أداة JSTACK لأنها سهلة الاستخدام وتأتي مع JDK. نظرًا لأنها أداة قائمة على الطرفية ، يمكننا كتابة بعض البرامج النصية لإنشاء مقالب مؤشر ترابط في الوقت المناسب للتحليل. اقرأ هذا المستند لمعرفة المزيد حول توليد مقالب مؤشر الترابط.
23. ما هو adadlock؟ كيفية تحليل وتجنب الجمود؟
يشير Deadlock إلى الموقف الذي يتم فيه حظر أكثر من خيطين إلى الأبد. يتطلب هذا الموقف ما لا يقل عن خيطين وأكثر من اثنين من الموارد.
لتحليل Deadlocks ، نحتاج إلى عرض تفريغ مؤشر ترابط تطبيق Java. نحتاج إلى معرفة تلك الخيوط مع حظر الحالة والموارد التي ينتظرونها. كل مورد لديه معرف فريد. باستخدام هذا المعرف ، يمكننا معرفة ما هي مؤشرات الترابط التي لديها بالفعل قفل الكائن الخاص به.
إن تجنب الأقفال المتداخلة ، وذلك باستخدام أقفال فقط حيث تكون هناك حاجة إليها وتجنب الانتظار إلى أجل غير محدد هي الطرق المعتادة لتجنب الجمود ، اقرأ هذا المقال لمعرفة كيفية تحليل الجمود.
24. ما هي فئة توقيت Java؟ كيفية إنشاء مهمة مع فترة زمنية محددة؟
java.util.timer هي فئة أدوات يمكن استخدامها لجدولة مؤشر ترابط لتنفيذها في وقت معين في المستقبل. يمكن ترتيب فئة المؤقت عن طريق جدولة المهام لمرة واحدة أو المهام الدورية.
java.util.timertask هي فئة مجردة تنفذ الواجهة القابلة للتشغيل. نحتاج إلى أن نرث هذه الفئة لإنشاء مهامنا الخاصة واستخدام المؤقت لترتيب تنفيذها.
25. ما هو تجمع الخيوط؟ كيف تنشئ بركة خيوط Java؟
يدير مجموعة الخيوط مجموعة من خيوط العمال ، ويتضمن أيضًا قائمة انتظار لوضع المهام في انتظار تنفيذها.
يوفر java.util.concurrent.executors تنفيذ واجهة java.util.concurrent.executor لإنشاء تجمعات مؤشرات الترابط. يوضح مثال تجمع مؤشرات الترابط كيفية إنشاء مجموعة مؤشرات الترابط واستخدامها ، أو قراءة مثال ScredultHreadPoolExecutor لمعرفة كيفية إنشاء مهمة دورية.
2. أسئلة مقابلة Java المتزامنة
1. ما هي العملية الذرية؟ ما هي الطبقات الذرية الموجودة في واجهة برمجة تطبيقات Java Concurrency؟
تشير العملية الذرية إلى وحدة مهام التشغيل التي لا تتأثر بعمليات أخرى. العمليات الذرية هي وسيلة ضرورية لتجنب عدم تناسق البيانات في بيئة متعددة الخيوط.
Int ++ ليست عملية ذرية ، لذلك عندما يقرأ مؤشر ترابط قيمته ويضيف 1 ، قد يقرأ مؤشر ترابط آخر القيمة السابقة ، والتي سترفع خطأ.
لحل هذه المشكلة ، من الضروري التأكد من أن عملية الإضافة ذرية ، ويمكننا استخدام تقنية التزامن للقيام بذلك قبل JDK1.5. إلى JDK1.5 ، توفر الحزمة java.util.concurrent.atomic أنواعًا طويلة من فئات التحميل ، والتي يمكن أن تضمن تلقائيًا أنها ذرية لعملياتها ولا تتطلب التزامن.
2. ما هي واجهة القفل في واجهة برمجة تطبيقات Java Concurrency؟ ما هي مزايا مقارنة التزامن؟
توفر واجهة القفل عملية قفل قابلة للتطوير أكثر من طريقة التزامن وكتلة التزامن. إنها تسمح بهياكل أكثر مرونة ، ويمكن أن يكون لها خصائص مختلفة تمامًا ، ويمكنها دعم الكائنات الشرطية لفئات متعددة ذات صلة.
مزاياها هي:
يمكن أن يجعل القفل أكثر عدلاً ، بحيث يستجيب مؤشر الترابط للمقاطعات أثناء انتظار القفل ، بحيث يمكن أن يحاول الخيط الحصول على القفل ، والعودة على الفور عندما لا يمكن الحصول على القفل أو الانتظار لفترة من الوقت ، والتي يمكن الحصول عليها وإصدارها في أوامر مختلفة في نطاقات مختلفة.
3. ما هو إطار المنفذين؟
تم تقديم إطار العمل المنفذ في Java 5 مع واجهة java.util.concurrent.executor. إطار المنفذ هو إطار عمل ينفذ المهام غير المتزامنة التي تنفذ مكالمات السياسة والجداول الزمنية وينفذ ويتحكم وفقًا لمجموعة من السياسات.
يمكن أن تسبب مؤشرات ترابط إنشاء غير محدودة فيضان ذاكرة التطبيق. لذا فإن إنشاء تجمع مؤشرات ترابط هو حل أفضل لأن عدد مؤشرات الترابط يمكن أن يكون محدودًا ويمكن إعادة تدوير عدد مؤشرات الترابط وإعادة استخدامه. يمكن باستخدام إطار عمل Executors إنشاء تجمع مؤشرات ترابط بسهولة. اقرأ هذه المقالة لمعرفة كيفية استخدام إطار عمل المنفذ لإنشاء تجمع مؤشرات ترابط.
4. ما هي قائمة انتظار الحظر؟ كيفية تنفيذ نموذج المنتج المستهلك باستخدام قوائم انتظار الحظر؟
ميزة java.util.concurrent.blockingqueue هي: عندما تكون قائمة الانتظار فارغة ، سيتم حظر تشغيل أو حذف العناصر من قائمة الانتظار ، أو عندما تكون قائمة الانتظار ممتلئة ، سيتم حظر تشغيل عناصر إلى قائمة الانتظار.
لا تقبل قائمة انتظار الحظر القيم الخالية ، وعندما تحاول إضافة قيم خالية إلى قائمة الانتظار ، فإنها ترمي nullpointerxception.
إن تنفيذ قوائم انتظار حظر آمن من مؤشرات الترابط ، وجميع طرق الاستعلام هي ذرية وتستخدم أقفال داخلية أو أشكال أخرى من التحكم المتزامن.
تعد واجهة Plockingqueue جزءًا من إطار عمل مجموعات Java ، والذي يستخدم بشكل أساسي لتنفيذ مشكلات المنتج والمستهلك.
5. ما الذي يمكن استدعاؤه ومستقبل؟
تقدم Java 5 واجهة java.util.concurrent.able في حزمة التزامن. إنه يشبه إلى حد كبير واجهة Runnable ، ولكن يمكنه إرجاع كائن أو رمي استثناء.
تستخدم الواجهة القابلة للاستدعاء الأداء العام لتحديد نوع الإرجاع الخاص بها. يوفر فئة Executors بعض الطرق المفيدة لتنفيذ المهام داخل مجموعة قابلة للاستدعاء في تجمع مؤشرات الترابط. نظرًا لأن المهمة القابلة للاتصال متوازية ، علينا أن ننتظر النتيجة التي تعود إليها. كائن java.util.concurrent.future يحل هذه المشكلة بالنسبة لنا. بعد أن يقدم تجمع الخيوط المهمة القابلة للاتصال ، يتم إرجاع كائن مستقبلي. باستخدامه ، يمكننا أن نعرف حالة المهمة القابلة للاستدعاء والحصول على نتيجة التنفيذ التي يتم إرجاعها بواسطة Callable. يوفر Future طريقة GET () تتيح لنا الانتظار حتى ينتهي الاتصال والحصول على نتيجة التنفيذ.
6. ما هو مستقبلات مستقبلية؟
يعد FutureTask تطبيقًا أساسيًا للمستقبل ، يمكننا استخدامه مع المنفذين للتعامل مع المهام غير المتزامنة. عادةً ما لا نحتاج إلى استخدام فئة FutureTask ، يصبح مفيدًا جدًا فقط عندما نخطط لإعادة كتابة بعض طرق الواجهة المستقبلية والحفاظ على التنفيذ الأساسي الأصلي. يمكننا فقط أن نرث منه وإعادة كتابة الأساليب التي نحتاجها.
7. ما هو تنفيذ الحاويات المتزامنة؟
تفشل فئات مجموعة Java بسرعة بسرعة ، مما يعني أنه عندما يتم تغيير المجموعة ويستخدم مؤشر الترابط التكرار لاجتياز المجموعة ، فإن طريقة التكرار التالية () ستلقي استثناءً من ConcurrentModificationException.
تدعم الحاويات المتزامنة التحديثات المتزامنة والتحديثات المتزامنة.
الفصول الرئيسية هي ConcurrenthashMap و CopyOnWriteArrayList و CopyOnWriteArrayset. اقرأ هذا المقال لمعرفة كيفية تجنب ConversIdificationException.
8. ما هي فئة المنفذين؟
يوفر Executors بعض طرق الأدوات للفئات Executor و ExecutorService و ScripedExecutorService و ThreadFactory و Flase.
يمكن استخدام المنفذين لإنشاء تجمعات مؤشرات ترابط مريحة.
في الواقع ، هناك العديد من أسئلة مقابلة Java الأساسية ، ويمكنك تنظيمها بشكل منهجي.
آمل أن ينجح الجميع في المقابلة!