فيما يلي أسئلة المقابلة الشائعة المتعلقة بخيوط Java ، يمكنك استخدامها للتحضير للمقابلة.
1) ما هو الموضوع؟
الخيط هو أصغر وحدة يمكن لنظام التشغيل إجراء عمليات وجدولة. وهي موجودة في العملية وهي وحدة التشغيل الفعلية في هذه العملية. يمكن للمبرمجين برمجة المعالجات المتعددة من خلالها ، ويمكنك تسريع المهام المكثفة للتشغيل باستخدام MultiTreading. على سبيل المثال ، إذا استغرق الأمر 100 مللي ثانية لخيط ما لإكمال المهمة ، فسيستغرق الأمر 10 مللي ثانية فقط لخيط سلسلة لإكمال تغيير المهمة باستخدام Ten Threads. توفر Java دعمًا ممتازًا للترابطات المتعددة على مستوى اللغة ، وهي أيضًا نقطة بيع جيدة. لمزيد من التفاصيل ، يرجى النقر هنا.
2) ما هو الفرق بين الخيط والعملية؟
المواضيع هي مجموعات فرعية من العمليات. يمكن أن تحتوي العملية على العديد من المواضيع ، ويقوم كل مؤشر ترابط بمهام مختلفة بالتوازي. تستخدم العمليات المختلفة مساحات ذاكرة مختلفة ، بينما تشترك جميع مؤشرات الترابط في نفس مساحة الذاكرة. لا تعبث مع ذاكرة المكدس ، يحتوي كل مؤشر ترابط على ذاكرة مكدس منفصلة لتخزين البيانات المحلية. لمزيد من التفاصيل ، يرجى النقر هنا.
3) كيفية تنفيذ المواضيع في جافا؟
هناك طريقتان في مستوى اللغة. مثيل لفئة Java.lang.Thread هو موضوع ، ولكنه يحتاج إلى استدعاء واجهة java.lang.runnable للتنفيذ. نظرًا لأن فئة مؤشرات الترابط نفسها هي الواجهة القابلة للتشغيل ، يمكنك أن ترث فئة java.lang.thread أو استدعاء واجهة Runnable مباشرة لتجاوز طريقة Run () لتنفيذ مؤشر الترابط. لمزيد من التفاصيل ، يرجى النقر هنا.
4) استخدام Runnable أو Thread؟
هذا السؤال هو متابعة للسؤال السابق. يعلم الجميع أنه يمكننا تنفيذ مؤشرات الترابط عن طريق وراثة فئة مؤشرات الترابط أو استدعاء واجهة Runnable. السؤال هو ، أي طريقة أفضل؟ تحت أي ظروف يجب أن أستخدمها؟ من السهل الإجابة على هذا السؤال إذا كنت تعلم أن Java لا تدعم ميراثًا متعددة للفئات ، ولكنه يتيح لك استدعاء واجهات متعددة. لذلك إذا كنت ترغب في أن ترث فئات أخرى ، بالطبع ، من الأفضل استدعاء واجهة Runnable. لمزيد من التفاصيل ، يرجى النقر هنا.
6) ما هو الفرق بين أساليب البدء () و Run () في فئة الخيط؟
غالبًا ما يتم طرح هذا السؤال ، لكن لا يزال بإمكانه التمييز بين فهم القائم بإجراء المقابلة لنموذج خيوط Java من هذا. يتم استخدام طريقة Start () لبدء مؤشر الترابط الذي تم إنشاؤه حديثًا ، ويتم استدعاء طريقة Run () داخليًا ، والتي تختلف عن تأثير استدعاء طريقة Run () مباشرة. عند استدعاء طريقة Run () ، سيتم استدعاؤه فقط في الموضوع الأصلي. في حالة عدم بدء تشغيل مؤشر ترابط جديد ، ستبدأ طريقة Start () الخيط الجديد. لمزيد من المناقشات ، يرجى النقر هنا
7) ما هو الفرق بين Runnable و Callse في Java؟
تمثل كل من Runnable و Callable المهام التي سيتم تنفيذها في مؤشرات ترابط مختلفة. لقد كان Runnable متاحًا منذ JDK1.0 ، وتمت إضافة Callable في JDK1.5. الفرق الرئيسي هو أن طريقة Call () لـ Callable يمكن أن تُرجع القيم ورمي الاستثناءات ، في حين أن طريقة Run () لا تحتوي على هذه الوظائف. يمكن استدعاء كائن مستقبلي محمّل بنتائج الحساب. مدونتي لديها المزيد من التعليمات التفصيلية.
8) ما هو الفرق بين Cyclicbarrier و CountDownlatch في Java؟
يمكن استخدام كل من Cyclicbarrier و CountDownlatch لجعل مجموعة من المواضيع تنتظر مؤشرات الترابط الأخرى. على عكس Cyclicbarrier ، لا يمكن إعادة استخدام CountDownlatch. انقر هنا لرؤية المزيد من المعلومات وعينة الرمز.
9) ما هو نموذج ذاكرة جافا؟
يحدد نموذج ذاكرة Java ويرشط برامج Java للتصرف بشكل حتمي بين بنيات الذاكرة المختلفة ، وحدات المعالجة المركزية ، وأنظمة التشغيل. من المهم بشكل خاص في المواقف متعددة الخيوط. يمكن أن يضمن نموذج ذاكرة Java أن التغييرات التي أجراها مؤشر ترابط واحد مرئية للمواضيع الأخرى ، وتحدث العلاقات أولاً. تحدد هذه العلاقة بعض القواعد لجعل المبرمجين أكثر وضوحًا في برامجهم المتزامنة. على سبيل المثال ، يضمن وجود علاقة أولاً:
يمكن تنفيذ الكود داخل المواضيع بالتسلسل ، والذي يسمى قواعد طلب البرنامج.
لنفس القفل ، يجب أن تحدث عملية فتح قبل عملية قفل أخرى تحدث في الوقت المناسب ، والتي تسمى أيضًا قاعدة قفل الإدارة.
عملية الكتابة السابقة إلى متقلبة هي قبل تشغيل القراءة التالية للمتقلبة ، والتي تسمى أيضًا قاعدة المتغير المتقلبة.
يجب استدعاء أي عملية داخل مؤشر ترابط بعد بدء () من هذا الموضوع ، والمعروفة أيضًا باسم قاعدة بدء الخيط.
سيتم إنهاء جميع عمليات الخيط قبل أن ينتهي الخيط.
يجب أن يكون تشغيل كائن ما بعد إنشاء الكائن ، والذي يسمى أيضًا قاعدة إنهاء الكائن.
متعدية
أوصي بشدة أن تقرأ الفصل 16 من "ممارسة برمجة Java Concurrency" لتعميق فهمك لنموذج ذاكرة Java.
10) ما هو المتغير المتطاير في جافا؟
التقلب هو معدّل خاص لا يمكن استخدامه إلا من قبل متغيرات الأعضاء. في الحالة التي تفتقر فيها برامج Java المتزامنة إلى فئات متزامنة ، تكون عمليات الرئاسة المتعددة على متغيرات الأعضاء شفافة للمواضيع الأخرى. يمكن أن يضمن المتغير المتطرف أن عملية القراءة التالية ستحدث بعد عملية الكتابة السابقة ، وهي القاعدة المتغيرة المتقلبة للسؤال السابق. انقر هنا لرؤية المزيد من المحتوى المتعلق بالتقلب.
11) ما هي سلامة الموضوع؟ هل Vector فئة آمنة لخيط؟ (انظر هنا للحصول على التفاصيل)
إذا كان الرمز الخاص بك في العملية التي تكون فيها ، فهناك عدة مؤشرات ترابط تعمل في نفس الوقت ، وقد تقوم هذه المواضيع بتشغيل هذا الرمز في نفس الوقت. إذا كانت نتيجة كل تشغيل هي نفس نتيجة تشغيل مؤشر ترابط واحد ، وكانت قيم المتغيرات الأخرى هي نفسها كما هو متوقع ، فهي آمنة مؤشرات الترابط. لن يتسبب كائن المثيل نفسه لفئة عداد آمنة مؤشرات الترابط في حدوث أخطاء في الحساب عند استخدامها بواسطة مؤشرات ترابط متعددة. من الواضح أنه يمكنك تقسيم فئة التجميع إلى مجموعتين ، آمنًا للموضوع وغير آمن. يستخدم Vector طرق التزامن لتحقيق سلامة مؤشرات الترابط ، في حين أن ArrayList مشابه لها ليست آمنة مؤشرات الترابط.
12) ما هي ظروف السباق في جافا؟ إعطاء مثال.
سوف تتسبب ظروف السباق في حدوث بعض الأخطاء في المواقف المتزامنة للبرنامج. عندما تتنافس متعدد الخيوط على بعض الموارد ، ستنشأ ظروف السباق. إذا فشل البرنامج الأول الذي يتم تنفيذه وتم تنفيذه لاحقًا ، فسيظهر بعض الأخطاء غير المؤكدة في البرنامج بأكمله. من الصعب اكتشاف هذه الأخطاء وتكرارها بسبب المنافسة العشوائية بين المواضيع. مثال على ذلك معالجة مضطربة ، راجع الإجابة للحصول على التفاصيل.
13) كيفية إيقاف موضوع في جافا؟
توفر Java واجهة برمجة تطبيقات غنية ولكنها لا توفر واجهة برمجة تطبيقات لإيقاف المواضيع. كان لدى JDK 1.0 في الأصل بعض أساليب التحكم مثل STOP () ، تعليق () واستئناف () ، ولكن بسبب التهديدات المحتملة للقتل ، تم إهمالها في إصدارات JDK اللاحقة. بعد ذلك ، لم يوفر مصمم Java API طريقة متوافقة وآمنة للخيط لإيقاف الخيط. عند تنفيذ طريقة Run () أو Call () ، سينتهي مؤشر الترابط تلقائيًا. إذا كنت ترغب في إنهاء مؤشر ترابط يدويًا ، فيمكنك استخدام المتغير المنطقي المتقلب للخروج من حلقة طريقة Run () أو إلغاء المهمة لمقاطعة مؤشر الترابط. انقر هنا لعرض نموذج رمز.
14) ماذا يحدث عندما يحدث استثناء عند تشغيل الخيط؟
هذا سؤال صعب للغاية في جافا واجهته في مقابلة. ببساطة ، إذا لم يتم القبض على الاستثناء ، فسيتوقف الخيط عن التنفيذ.
Thread.UncaughtexceptionHandler هي واجهة مضمنة للتعامل مع الاستثناءات غير المطلوبة التي تسبب انقطاع مؤشر الترابط المفاجئ. عندما يتسبب استثناء غير معطل في مقاطعة مؤشر ترابط ، سيستخدم JVM Thread.getUncaughtexceptionHandler () للاستعلام عن سلسلة مؤشر الترابط غير المؤهلة وتمرير مؤشر الترابط واستثناء كمعلمات لطريقة uncaughtexception () للمعالج للمعالجة.
15) كيفية مشاركة البيانات بين موضوعين؟
يمكنك القيام بذلك عن طريق مشاركة الكائنات ، أو استخدام هياكل البيانات المتزامنة مثل حظر قوائم الانتظار. يستخدم هذا البرنامج التعليمي ، "الاتصالات inter-thread" (التي تتضمن مشاركة الكائنات بين خيطين) الأساليب الانتظار وإخطار بتنفيذ نموذج المستهلك للمنتج.
16) ما هو الفرق بين الإخطار والإخطار في جافا؟
هذه مشكلة صعبة أخرى ، لأن Multithreading يمكن أن تنتظر أقفال مراقبة واحدة ، ويوفر مصممو API Java بعض الطرق لإخطارهم عند انتظار تغيير الظروف ، ولكن لا يتم تنفيذ هذه الطرق بالكامل. لا يمكن أن تستيقظ طريقة الإخطار () على موضوع معين ، لذلك لن يعمل إلا عندما ينتظر مؤشر ترابط واحد. ويستيقظ إخطار () جميع مؤشرات الترابط ويسمح لهم بالتنافس على الأقفال للتأكد من أن موضوع واحد على الأقل يمكن أن يستمر في التشغيل. مدونتي لديها المزيد من المعلومات التفصيلية وعينة الرمز.
17) لماذا تنتظر وإعلام وإخطار الأساليب ليس في فئة الخيط؟
هذا سؤال يتعلق بالتصميم يبحث في تصور القائم بإجراء المقابلة للأنظمة الحالية وشيء شائع ولكنه يبدو غير معقول. عند الإجابة على هذه الأسئلة ، تحتاج إلى شرح سبب وجود هذه الأساليب في فئة الكائن ، ولماذا لا تضعها في فئة الخيط. أحد الأسباب الواضحة هو أن الأقفال التي توفرها Java هي مستوى الكائن بدلاً من مستوى مؤشر الترابط ، وأن كل كائن يحتوي على قفل ، يتم الحصول عليه من خلال مؤشرات الترابط. إذا احتاج مؤشر الترابط إلى انتظار بعض الأقفال ، فمن المنطقي استدعاء طريقة Wait () في الكائن. إذا تم تعريف طريقة WAIT () في فئة مؤشرات الترابط ، فلن يكون من الواضح أن قفل الخيط ينتظر. ببساطة ، نظرًا لأن الانتظار والإخطار والإخطار هي عمليات على مستوى القفل ، يتم تعريفها في فئة الكائن لأن القفل ينتمي إلى الكائن. يمكنك أيضًا الاطلاع على هذه المقالة لمعرفة المزيد.
18) ما هو متغير threadlocal؟
ThreadLocal هو متغير خاص في Java. كل مؤشر ترابط يحتوي على مؤشر ترابط ، مما يعني أن كل مؤشر ترابط له متغير مستقل خاص به ، ويتم القضاء على ظروف السباق تمامًا. إنها طريقة رائعة للحصول على مؤشر ترابط لإنشاء كائنات باهظة الثمن. على سبيل المثال ، يمكنك استخدام ThreadLocal لجعل SimpleDateFormat آمنًا لأن هذه الفئة مكلفة لإنشاء وتتطلب إنشاء مثيل مختلف لكل مكالمة ، لذلك لا يستحق استخدامها محليًا. إذا قمت بتزويد كل مؤشر ترابط بنسخة فريدة من المتغيرات ، فسيحسن الكفاءة بشكل كبير. أولاً ، يتم تقليل عدد الكائنات باهظة الثمن التي تم إنشاؤها عن طريق تعدد الإرسال. ثانياً ، يمكنك الحصول على سلامة الخيط دون استخدام التزامن أو الثبات المكلف. مثال جيد آخر للمتغيرات المحلية الخيط هو فئة ThreadlocalRandom ، مما يقلل من عدد الكائنات العشوائية باهظة الثمن التي تم إنشاؤها في بيئة متعددة الخيوط. انظر الإجابات لمعرفة المزيد.
19) ما هو مستقبلات مستقبلية؟
في برنامج Java Concurrent ، يمثل FutureTask عملية غير متزامنة يمكن إلغاؤها. يحتوي على طرق مثل بدء التشغيل وإلغاء العمليات ، والاستعلام عما إذا كانت العمليات قد اكتملت واسترداد نتائج التشغيل. لا يمكن استرداد النتيجة إلا عند اكتمال العملية. إذا لم تكتمل العملية ، فسيتم حظر طريقة GET. يمكن لكائن FutureTask لفائف الكائنات التي تتصل بالاتصال والمكالمات. نظرًا لأن FutureTask يتصل أيضًا بالواجهة القابلة للتشغيل ، يمكن تقديمها إلى المنفذ للتنفيذ.
20) ما هو الفرق بين أساليب المقاطعات و isinterruptedd في جافا؟
الفرق الرئيسي بين المقاطعة () و isInterredred () هو أن الأول سوف يزيل حالة المقاطعة في حين أن الأخير لن يفعل ذلك. يتم تنفيذ آلية المقاطعة من Java Multithreading مع معرفات داخلية. استدعاء Thread.Interrupt () لمقاطعة مؤشر ترابط سيعين معرف المقاطعة على TRUE. عندما يستدعي مؤشر ترابط المقاطعة موضوع الطريقة الثابتة. يتم استخدام الطريقة غير المنتظمة ()) للاستعلام عن حالة المقاطعة من مؤشرات الترابط الأخرى دون تغيير معرف حالة المقاطعة. ببساطة ، فإن أي طريقة ترمي مقاطعًا ستقوم بمسح حالة المقاطعة. في أي حال ، قد يتم تغيير حالة المقاطعة للخيط من خلال مواضيع أخرى استدعاء المقاطعات.
21) لماذا يجب استدعاء الأساليب الانتظار والإخطار في كتلة متزامنة؟
ويرجع ذلك أساسًا إلى أن واجهة برمجة تطبيقات Java يفرض ذلك ، وإذا لم تفعل ذلك ، فسيقوم رمزك بإلقاء استثناء غير شرعي. سبب آخر هو تجنب ظروف العرق بين الانتظار والإخطار.
22) لماذا يجب عليك التحقق من ظروف الانتظار في الحلقة؟
قد تتلقى المواضيع في حالة الانتظار تنبيهات الخطأ والاستعاء الزائفة. إذا لم يتم فحص حالة الانتظار في الحلقة ، فسيخرج البرنامج دون تلبية شرط النهاية. لذلك ، عندما يستيقظ مؤشر ترابط الانتظار ، لا يمكن اعتبار أن حالة الانتظار الأصلية لا تزال صالحة ، وقد تتغير خلال هذه الفترة بعد استدعاء طريقة الإخطار () وقبل أن يستيقظ مؤشر ترابط الانتظار. هذا هو السبب في أن طريقة Wait () في حلقة ما يعمل بشكل أفضل ، يمكنك إنشاء قوالب في Eclipse للاتصال بالانتظار وإخطارها وتجربتها. إذا كنت ترغب في معرفة المزيد حول هذه المشكلة ، فإنني أوصيك بقراءة فصول الخيوط والمزامنة في كتاب "Java الفعالة".
23) ما هو الفرق بين المجموعات المتزامنة والمجموعات المتزامنة في جافا؟
توفر كل من المجموعات المتزامنة والمجموعات المتزامنة مجموعات مناسبة آمنة لخيط الخيط من أجل التعددية والتزامن ، ولكن المجموعات المتزامنة أكثر قابلية للتطوير. قبل Java 1.5 ، استخدم المبرمجون مجموعات متزامنة فقط ، وعندما تساهم التزامن متعدد الخيوط ، فإن ذلك سيؤدي إلى الخلاف ، ويعوق قابلية التوسع في النظام. يقدم Java5 مجموعات متزامنة مثل ConcurrentHashMap ، والتي لا توفر سلامة الخيوط فحسب ، بل تعمل أيضًا على تحسين قابلية التوسع مع التقنيات الحديثة مثل فصل القفل والمناطق الداخلية. انظر الإجابة لمزيد من التفاصيل.
24) ما هو الفرق بين الكومة والمكدس في جافا؟
لماذا تم تصنيف هذا السؤال في أسئلة المقابلة متعددة الخيوط والمتزامنة؟ لأن المكدس عبارة عن منطقة ذاكرة مرتبطة ارتباطًا وثيقًا بالخيط. يحتوي كل مؤشر ترابط على ذاكرة المكدس الخاصة به ، والتي يتم استخدامها لتخزين المتغيرات المحلية ومعلمات الطريقة ومكالمات المكدس. المتغيرات المخزنة في مؤشر ترابط واحد غير مرئية لخيوط أخرى. الكومة هي منطقة ذاكرة شائعة تشاركها جميع مؤشرات الترابط. يتم إنشاء الكائنات في كومة. من أجل تحسين الكفاءة ، سيقوم الخيط بتخزين A من الكومة إلى مجموعته الخاصة. إذا استخدمت مؤشرات ترابط متعددة هذا المتغير ، فقد يسبب مشاكل. في هذا الوقت ، يمكن أن يلعب المتغير المتطرف دورًا ، الأمر الذي يتطلب من مؤشر الترابط قراءة قيمة المتغير من الذاكرة الرئيسية.
انظر الإجابة لمزيد من التفاصيل.
25) ما هو تجمع الخيوط؟ لماذا تستخدمه؟
يتطلب إنشاء المواضيع موارد ووقت باهظ الثمن. إذا تم إنشاء مؤشر ترابط فقط بعد أن يأتي المهمة ، سيصبح وقت الاستجابة أطول ، ويمكن للعملية إنشاء عدد محدود من مؤشرات الترابط. لتجنب هذه المشكلات ، يتم إنشاء العديد من المواضيع للاستجابة والمعالجة عند بدء البرنامج. وتسمى برك الخيوط ، والموضوعات داخل يسمى المواضيع العامل. بدءًا من JDK1.5 ، يوفر Java API إطار المنفذ الذي يسمح لك بإنشاء تجمعات خيوط مختلفة. على سبيل المثال ، تجمع مؤشر ترابط واحد ، يتعامل مع مهمة واحدة في وقت واحد ؛ عدد ثابت من تجمعات مؤشرات الترابط أو تجمعات خيوط ذاكرة التخزين المؤقت (تجمع مؤشرات ترابط قابل للتمديد مناسب للعديد من البرامج ذات المهام قصيرة الأجل). انظر هذا المقال لمزيد من التفاصيل.
26) كيف تكتب التعليمات البرمجية لحل مشاكل المنتج والمستهلك؟
في الواقع ، تنتمي العديد من مشكلات الخيوط التي تحلها إلى نموذج المستهلك للمنتج ، وهي أن مهمة إنتاج مؤشرات ترابط واحدة مخصصة للاستهلاك بواسطة مؤشرات الترابط الأخرى. يجب أن تعرف كيفية التواصل بين المواضيع لحل هذه المشكلة. الطريقة ذات المستوى المنخفض نسبيًا هي استخدام الانتظار والإخطار لحل هذه المشكلة. الطريقة الأكثر ممتازة هي استخدام semaphore أو blockingqueue لتنفيذ المنتج والنموذج المستهلك. هذا البرنامج التعليمي ينفذها.
27) كيف تتجنب الجمود؟
Deadlock في Java Multhereshreading
يشير Deadlock إلى ظاهرة الانتظار المتبادل الناجم عن عمليتين أو أكثر أثناء عملية التنفيذ بسبب المنافسة على الموارد. بدون قوى خارجية ، لن يكونوا قادرين على المتابعة. هذه مشكلة خطيرة ، لأن الجمود سيجعل برنامجك يعلق وغير قادر على إكمال المهمة. يجب استيفاء الشروط الأربعة التالية لحدوث طريق مسدود:
حالة الاستبعاد المتبادل: لا يمكن استخدام مورد إلا من خلال عملية واحدة في وقت واحد.
اطلب وشروط الاحتفاظ: عندما يتم تكوين العملية بسبب طلب الموارد ، فإنها تحتفظ بالموارد المكتسبة.
شروط عدم الحرمان: لا يمكن حرمان الموارد التي تم الحصول عليها من قبل العملية بالقوة حتى نهاية الاستخدام.
شروط انتظار الحلقة: تتشكل علاقة مورد انتظار حلقة بين عدة عمليات متصلة في الرأس والذيل.
أسهل طريقة لتجنب حالات الجمود هي منع ظروف انتظار الحلقة ، وضبط الأعلام وفرز جميع الموارد في النظام ، وتصد على أنه يجب تشغيل جميع موارد تطبيق العملية بترتيب معين (ترتيب تصاعدي أو تنازلي) لتجنب المسدود. يحتوي هذا البرنامج التعليمي على أمثلة رمز وتفاصيل مناقشة حول تجنب الجمود.
28) ما هو الفرق بين الأقفال الحية والكمال في جافا؟
هذا هو امتداد السؤال السابق. الأقفال الحية تشبه الجمود. الفرق هو أن حالة الخيط أو العملية في القفل المباشر تتغير باستمرار. يمكن اعتبار الأقفال الحية نوعًا خاصًا من الجوع. مثال واقعي للقفل المباشر هو عندما يجتمع شخصان في ممر ضيق. يحاول كلاهما تجنب بعضهما البعض حتى يتمكن بعضهما البعض من المرور ، ولكن لأن اتجاه التجنب هو نفسه ، لا يمكن لأحد أن يمر عبر الممر في النهاية. ببساطة ، فإن الفرق الرئيسي بين القفل المباشر والقفل الميت هو أنه يمكن تغيير حالة العملية السابقة ولكن لا يمكن الاستمرار في تنفيذها.
29) كيفية اكتشاف ما إذا كان الخيط لديه قفل؟
لم أكن أعلم مطلقًا أنه يمكننا اكتشاف ما إذا كان الخيط يحتوي على قفل حتى حضرت مقابلة عبر الهاتف. هناك طريقة في java.lang.thread تسمى HoldSlock () ، والتي تُرجع صحيحًا إذا وفقط إذا كان الخيط الحالي يمتلك قفلًا لكائن معين. يمكنك التحقق من هذه المقالة لمعرفة المزيد.
30) كيف تحصل على كومة الخيط في جافا؟
بالنسبة لأنظمة التشغيل المختلفة ، هناك طرق متعددة للحصول على مجموعة مؤشرات الترابط من عمليات Java. عندما تحصل على مكدس مؤشر الترابط ، ستقوم JVM بتخزين حالة جميع مؤشرات الترابط إلى ملف السجل أو إخراجها إلى وحدة التحكم. في Windows ، يمكنك استخدام مجموعة مفاتيح Ctrl + Break للحصول على مكدس مؤشر الترابط ، واستخدام أمر Kill -3 في Linux. يمكنك أيضًا استخدام أداة JSTACK للحصول عليها ، والتي تعمل على معرفات مؤشرات الترابط ، ويمكنك استخدام أداة JPS للعثور على المعرف.
31) أي المعلمة في JVM تستخدم للتحكم في كومة الخيوط مع كومة صغيرة
هذه المشكلة بسيطة للغاية ، يتم استخدام المعلمة -xss للتحكم في حجم مكدس الخيط. يمكنك عرض قائمة تكوين JVM لمزيد من المعلومات حول هذه المعلمة.
32) ما هو الفرق بين متزامن و reenrantlock في جافا؟
تمكنت Java من تحقيق الاستبعاد المتبادل لفترة طويلة من خلال الكلمات الرئيسية المتزامنة ، ولديه بعض العيوب. على سبيل المثال ، لا يمكنك توسيع الأساليب أو حظر الحدود بخلاف الأقفال ، ولا يمكنك الإلغاء في منتصف الطريق عند محاولة الحصول على الأقفال ، إلخ. يوفر Java 5 عناصر تحكم أكثر تعقيدًا لحل هذه المشكلات من خلال واجهة القفل. تقوم فئة REENTRANTLOCK بتنفيذ القفل ، الذي يحتوي على نفس التزامن ودلالات الذاكرة على أنها متزامنة وهي قابلة للتمديد أيضًا. يمكنك التحقق من هذه المقالة لمعرفة المزيد
33) هناك ثلاثة مؤشرات ترابط T1 و T2 و T3. كيف تتأكد من تنفيذها بالترتيب؟
هناك العديد من الطرق لتمكين مؤشرات الترابط من التنفيذ بترتيب محدد في MultiTreading. يمكنك استخدام طريقة Join () لفئة مؤشرات الترابط لبدء مؤشر ترابط آخر في مؤشر ترابط واحد ، ويكمل مؤشر ترابط آخر مؤشر الترابط لمتابعة التنفيذ. لضمان ترتيب ثلاثة مؤشرات ترابط ، يجب أن تبدأ آخر واحد أولاً (مكالمات T3 T2 ، T2 T1) ، بحيث سيتم إكمال T1 أولاً وسيتم إكمال T3 أخيرًا. يمكنك التحقق من هذه المقالة لمعرفة المزيد.
34) ما هي وظيفة طريقة العائد في فئة الخيط؟
يمكن أن تتوقف طريقة العائد عن كائن مؤشر الترابط الذي يتم تنفيذه حاليًا والسماح لمؤشرات الترابط الأخرى بنفس الأولوية التي يتم تنفيذها. إنها طريقة ثابتة وتضمن فقط أن الخيط الحالي يتخلى عن استخدام وحدة المعالجة المركزية ولا يمكن أن يضمن أن مؤشرات الترابط الأخرى يمكن أن تشغل وحدة المعالجة المركزية. يمكن تنفيذ عائد تنفيذ الخيط () مباشرة بعد دخول الدولة المتوقفة. انقر هنا لمعرفة المزيد حول طريقة العائد.
35) ما هو تزامن concurrenthashmap في جافا؟
يقسم ConcurrentHashMap الخريطة الفعلية إلى عدة أجزاء لتحقيق سلامة التوسع وسلامة الخيط. يتم الحصول على هذا القسم باستخدام التزامن ، وهو معلمة اختيارية لمشارك فئة ConcurrentHashMap ، مع قيمة افتراضية قدرها 16 ، بحيث يمكن تجنب الخلاف في مواقف الترقيم المتعددة. لمزيد من التزامن والتغييرات الداخلية ، يرجى قراءة مقالتي كيف يعمل ConcurrentHashMap في Java.
36) ما هو Semaphore في Java؟
Semaphore في Java هي فئة مزامنة جديدة ، وهي إشارة عد. من الناحية المفاهيمية ، من الناحية المفاهيمية ، تحافظ Semaphore على مجموعة من التصاريح. إذا لزم الأمر ، سيتم حظر كل الحصول على () قبل توفر الترخيص قبل الحصول عليه. يضيف كل إصدار () إذنًا ، والذي قد يصدر مستحوذًا على حظر. ومع ذلك ، دون استخدام كائن الترخيص الفعلي ، يحسب Semaphore فقط أرقام الترخيص المتاحة ويتخذ الإجراءات المقابلة. غالبًا ما يتم استخدام Semaphores في التعليمات البرمجية المتعددة ، مثل تجمعات اتصال قاعدة البيانات. لمزيد من التفاصيل ، يرجى النقر هنا.
37) إذا قمت بإرسال مهمة ، فإن قائمة انتظار مجموعة مؤشرات الترابط ممتلئة. ماذا يحدث عندما يحدث؟
هذا السؤال هو ماكرة وسيعتقد العديد من المبرمجين أن المهمة ستحظر حتى تحتوي قائمة انتظار تجمع الخيوط على مساحة. في الواقع ، إذا كان لا يمكن تحديد موعد تنفيذ المهمة ، فستقوم طريقة إرسال () ThreadPoolExecutor بإلقاء استثناء رفض.
38) ما هو الفرق بين إرسال () و Execute () الأساليب في مجموعة خيوط Java؟
يمكن لكلتا الطريقتين تقديم المهام إلى تجمع الخيوط. نوع الإرجاع من طريقة التنفيذ () هو باطل ، والذي يتم تعريفه في واجهة المنفذ ، ويمكن للطريقة إرسال () إرجاع الكائن المستقبلي الذي يحمل نتائج الحساب. يتم تعريفه في واجهة ExecutorService. يمتد واجهة المنفذ. فئات تجمع الخيوط الأخرى مثل ThreadPoolexecutor و ScredulThReadPoolExecutor لها هذه الطرق. لمزيد من التفاصيل ، يرجى النقر هنا.
39) ما هي طريقة الحظر؟
تعني طريقة الحظر أن البرنامج سينتظر إكمال الطريقة ولا تفعل أي شيء آخر. طريقة قبول () Serversocket هي الانتظار حتى يتصل العميل. الحظر هنا يعني أنه سيتم تعليق الخيط الحالي قبل إرجاع نتيجة المكالمة ولن يعود حتى يتم الحصول على النتيجة. بالإضافة إلى ذلك ، هناك طرق غير متزامنة وغير محظورة تعود قبل الانتهاء من المهمة. لمزيد من التفاصيل ، يرجى النقر هنا.
40) هل الأرجوحة آمنة؟ لماذا؟
يمكنك إعطاء إجابة إيجابية ، والتأرجح ليس آمنًا للموضوع ، ولكن يجب أن تشرح سبب عدم وجود هذه الإجابة حتى لو لم يسألك القائم بإجراء المقابلة عن السبب. عندما نقول أن التأرجح ليس آمنًا للخيط ، فإنه غالبًا ما يذكر مكوناته ، والتي لا يمكن تعديلها في سلسلة متعددة. يجب إكمال جميع التحديثات لمكونات واجهة المستخدم الرسومية في سلاسل الرسائل. يوفر Swing طريقتين متزامنتين وغير متزامنين للتحديث. انقر هنا لرؤية المزيد من المحتوى المتعلق بسلامة الأرجوحة والخيط.
41) ما هو الفرق بين InvokeAndWait و Invokelater في Java؟
يتم توفير هاتين الطريقتين بواسطة API Swing API لمطوري Java لتحديث مكونات واجهة المستخدم الرسومية من مؤشر الترابط الحالي بدلاً من مؤشر ترابط إرسال الحدث. يقوم InvokeAndWait () بتحديث مكونات واجهة المستخدم الرسومية بشكل متزامن ، مثل شريط التقدم. بمجرد تحديث التقدم ، يجب أيضًا تغيير شريط التقدم وفقًا لذلك. إذا تم تتبع التقدم بواسطة مؤشرات ترابط متعددة ، فسيتم استدعاء طريقة InvokeAndWait () لطلب مؤشر ترابط إرسال الحدث لتحديث المكون وفقًا لذلك. تسمى طريقة Invokelater () بشكل غير متزامن لتحديث المكون. لمزيد من التفاصيل ، يرجى النقر هنا.
42) ما هي الطرق في واجهة برمجة تطبيقات التأرجح التي آمنت الخيط؟
يذكر هذا السؤال أيضًا سلامة التأرجح والسلامة. على الرغم من أن المكونات ليست آمنة لخيط الخيط ، إلا أن هناك بعض الطرق التي يمكن أن تسمى متعددة الخيوط ، مثل إعادة الراحة () و RELIDAIDED (). طريقة setText () لـ JTextComponent وطرق insert () و append () من JTextarea هي أيضًا آمنة من مؤشرات الترابط.
43) كيفية إنشاء كائن ثابت في جافا؟
يبدو أن هذه المشكلة لا علاقة لها بمتعدد الخيوط ، لكن الثبات يساعد في تبسيط البرامج المتزامنة المعقدة بالفعل. يمكن مشاركة الكائنات غير القابلة للتغيير دون المزامنة ، مما يقلل من النفقات العامة المزامنة عند الوصول المتزامن إلى الكائن. ومع ذلك ، لا تملك Java التعليق التوضيحي @immutable. لإنشاء فئة غير قابلة للتغيير ، نحتاج إلى تنفيذ الخطوات التالية: تهيئة جميع الأعضاء من خلال مُنشئ ، ولا تقدم طريقة للمتغير ، وإعلان جميع الأعضاء على أنهم خاصون ، بحيث لا يُسمح للوصول إلى هؤلاء الأعضاء مباشرة. في طريقة getter ، لا تقم بإرجاع الكائن بشكل مباشر ، ولكن استنساخ الكائن وأرجع نسخة من الكائن. مقالتي كيفية جعل كائن غير قابل للتغيير في Java له دروس مفصلة ، ويمكن أن تكون ممتلئًا بالثقة بعد قراءته.
44) ما هو readwritelock في جافا؟
بشكل عام ، فإن أقفال القراءة والكتابة هي نتيجة لتكنولوجيا فصل القفل المستخدمة لتحسين أداء البرامج المتزامنة. ReadWritelock in Java هي واجهة جديدة تم إضافتها في Java 5. يحافظ ReadWritelock على زوج من الأقفال المرتبطة ، وواحد للعمليات للقراءة فقط وواحدة للكتابة. قد يتم الاحتفاظ بقفل القراءة بواسطة مؤشرات ترابط قراءة متعددة في نفس الوقت بدون مؤشر ترابط الكتابة. أقفال الكتابة حصرية ، يمكنك تنفيذ هذه القاعدة باستخدام REENTRANTREADWRITELOCK في JDK ، والتي تدعم ما يصل إلى 65535 أقفال الكتابة و 65535 أقفال قراءة.
45) ما هي الحلقة المزدحمة في MultiThreading؟
الحلقات المزدحمة هي عندما يستخدم المبرمجون حلقات لجعل موضوع الانتظار. على عكس الأساليب التقليدية مثل Wait () أو Sleep () أو العائد () ، فإنهم جميعًا يتخلون عن التحكم في وحدة المعالجة المركزية ، في حين أن الحلقات المزدحمة لا تتخلى عن وحدة المعالجة المركزية ، إلا أنها تدير حلقة فارغة. والغرض من هذا هو الحفاظ على ذاكرة التخزين المؤقت لوحدة المعالجة المركزية. في نظام متعدد النواة ، قد يعمل أحد الخيوط للاستيقاظ في نواة أخرى ، والتي ستعيد بناء ذاكرة التخزين المؤقت. إنه متاح لتجنب إعادة بناء ذاكرة التخزين المؤقت وتقليل الوقت في انتظار إعادة البناء. يمكنك التحقق من هذه المقالة لمزيد من المعلومات.
46) ما هو الفرق بين المتغيرات المتطايرة والمتغيرات الذرية؟
هذا سؤال مثير للاهتمام. أولاً ، يبدو المتغير المتطاير مشابهًا جدًا للمتغير الذري ، لكن الوظائف مختلفة. يضمن المتغير المتطاير وجود علاقة سلف ، أي أن عمليات الكتابة ستحدث قبل عمليات القراءة اللاحقة ، لكنها لا تضمن الذرة. على سبيل المثال ، تعديل متغير العد مع متقلبة ، فإن عملية Count ++ ليست ذرية. يمكن أن تجعل الطريقة الذرية التي توفرها فئة AtomicInteger هذه العملية ذرية. على سبيل المثال ، ستؤدي طريقة getAndIncrement () عمليات الزيادة الذرية لإضافة القيمة الحالية بمقدار واحد ، ويمكن أيضًا أن تؤدي أنواع البيانات والمتغيرات المرجعية أيضًا إلى إجراء عمليات مماثلة.
47) ماذا يحدث إذا قام مؤشر ترابط داخل كتلة التزامن بإلقاء استثناء؟
لقد خدع هذا السؤال العديد من مبرمجي Java. إذا كان بإمكانك التفكير فيما إذا كان القفل يطلق هذا الدليل للإجابة ، فلا تزال تأمل في الإجابة عليها بشكل صحيح. بغض النظر عما إذا كانت كتلة التزامن الخاصة بك تخرج بشكل طبيعي أو غير طبيعي ، فإن الخيوط الموجودة في الداخل ستطلق القفل ، لذلك أفضل كتلة التزامن مقارنة بواجهة القفل لأنها لا تتطلب مني أن أقضي طاقتي في إطلاق القفل. يمكن تنفيذ هذه الوظيفة عن طريق إطلاق القفل في الكتلة أخيرًا.
48) ما هو قفل التحقق المزدوج في وضع Singleton؟
غالبًا ما يتم طرح هذا السؤال في مقابلات Java ، لكن القائم بإجراء المقابلة راضٍ عن 50 ٪ فقط عن الإجابة على هذا السؤال. لا يستطيع نصف الناس كتابة قفل فحص مزدوج ولا يمكن أن يقول نصف الناس مخاطر مخفية وكيف قام Java 1.5 بتصحيحه. إنها في الواقع طريقة قديمة لإنشاء المفردات الآمنة. عند إنشاء مثيل Singleton لأول مرة ، يحاول تحسين الأداء باستخدام قفل واحد ، ولكن نظرًا لأنه معقد للغاية ، فإنه يفشل في JDK1.4 ، وأنا شخصياً لا أحب ذلك أيضًا. على أي حال ، حتى لو كنت لا تحب ذلك ، فلا يزال يتعين عليك فهمه لأنه غالبًا ما يطلب منه. يمكنك التحقق من كيفية قيام القفل المزدوج على Singleton Works لمزيد من المعلومات.
49) كيفية إنشاء المفرد الآمن مؤشر ترابط في جافا؟
هذا هو متابعة للسؤال أعلاه. إذا كنت لا تحب أقفال التحقق المزدوجة وسأل القائم بإجراء المقابلة عن طريقة بديلة لإنشاء فئة Singleton ، فيمكنك استخدام ميزات تحميل فئة JVM وميزات التهيئة المتغيرة الثابتة لإنشاء مثيل Singleton ، أو استخدام أنواع التعداد لإنشاء Singleton. أنا أحب هذه الطريقة. يمكنك التحقق من هذه المقالة لمزيد من المعلومات.
50) اكتب 3 أفضل الممارسات المتعددة التي تتبعها
يعجبني هذا النوع من المشكلات أكثر ، وأعتقد أنك ستتبع أفضل الممارسات عند كتابة التعليمات البرمجية المتزامنة لتحسين الأداء. فيما يلي ثلاثة أفضل الممارسات أعتقد أن معظم مبرمجي Java يجب أن يتبعوا:
امنح موضوعك اسمًا ذا معنى.
هذا يجعل من السهل العثور على الأخطاء أو تتبعها. OrderProcessor ، quoteprocessor أو TradeProcessor هذا الاسم أفضل بكثير من الموضوع -1. Thread-2 و Thread-3. امنح الموضوع اسمًا يتعلق بالمهمة التي يريد إكمالها. جميع الأطر الرئيسية وحتى JDKs تتبع هذه الممارسات أفضل.
تجنب قفل وتضييق نطاق التزامن
الأقفال باهظة الثمن والتبديل السياق أكثر استهلاكا للوقت. حاول استخدام التزامن والأقفال لتقليل المنطقة الحرجة. لذلك أفضل كتل المزامنة على طريقة التزامن ، مما يعطيني التحكم المطلق على القفل.
استخدم المزيد من فئات التزامن واستخدم الانتظار والإخطار أقل
أولاً ، تقوم CountDownlatch و Semaphore و Cyclicbarrier و Ebuitanger Synchronous بتبسيط عمليات الترميز ، في حين أنه من الصعب التحكم في تدفقات التحكم المعقدة مع الانتظار والإخطار. ثانياً ، تتم كتابة هذه الفئات والاحتفاظ بها من قبل أفضل الشركات. سوف تستمر في تحسين وتحسين في JDKs اللاحقة. باستخدام أدوات التزامن على المستوى الأعلى ، يمكن تحسين برنامجك دون أي جهد.
استخدم مجموعات أكثر متزامنة ومجموعات أقل متزامنة. هذا هو أفضل الممارسات الأخرى السهلة للمتابعة. مجموعات متزامنة أكثر قابلية للتطوير من المجموعات المتزامنة ، لذا فإن استخدام المجموعات المتزامنة أفضل للبرمجة المتزامنة. إذا كنت بحاجة إلى استخدام الخريطة في المرة القادمة ، فيجب عليك أولاً التفكير في استخدام ConcurrentHashMap. مقالتي Java Consurrent مجموعات لديها وصف أكثر تفصيلا.
51) كيف تجبر بدء تشغيل الخيط؟
هذه المشكلة تشبه كيفية إجبار جمع القمامة جافا. لا توجد طريقة للقيام بذلك بعد. على الرغم من أنه يمكنك استخدام System.gc () لأداء جمع القمامة ، إلا أنه ليس من الممكن أن تكون ناجحًا. لا توجد وسيلة لإجبار موضوع على البدء في Java ، ويتم التحكم فيه بواسطة جدولة مؤشرات الترابط ولا تنشر Java واجهة برمجة التطبيقات ذات الصلة.
52) ما هو إطار انضمام الشوكة في جافا؟
fork join 框架是JDK7 中出现的一款高效的工具,Java 开发人员可以通过它充分利用现代服务器上的多处理器。它是专门为了那些可以递归划分成许多子模块设计的,目的是将所有可用的处理能力用来提升程序的性能。fork join 框架一个巨大的优势是它使用了工作窃取算法,可以完成更多任务的工作线程可以从其它线程中窃取任务来执行。你可以查看这篇文章获得更多信息。
53) Java 多线程中调用wait () 和sleep ()方法有什么不同?
Java 程序中wait 和sleep 都会造成某种形式的暂停,它们可以满足不同的需要。wait ()方法用于线程间通信,如果等待条件为真且其它线程被唤醒时它会释放锁,而sleep ()方法仅仅释放CPU 资源或者让当前线程停止执行一段时间,但不会释放锁。你可以查看这篇文章获得更多信息。