JavaRush /جاوا بلاگ /Random-UR /ترجمہ: تھریڈ کے لحاظ سے انٹرویو کے 50 سرفہرست سوالات۔ حصہ...
KapChook
سطح
Volga

ترجمہ: تھریڈ کے لحاظ سے انٹرویو کے 50 سرفہرست سوالات۔ حصہ 1.

گروپ میں شائع ہوا۔
اصل مضمون کے ترجمے کا پہلا حصہ Top 50 Java Thread Interview Questions Answers for Freshers, Experienced Programmers. دوسرا حصہ. نوٹ: مضمون بڑا نکلا، جس کی وجہ سے یہ ایک موضوع پر فٹ نہیں بیٹھتا۔ اس کے علاوہ، یہ کافی پیچیدہ ہے، میں نے اسے گوگل کرنے کی پوری کوشش کی، لیکن پھر بھی۔ لہٰذا، ہم انگریزی میں روانی رکھنے والے شرکاء سے کہتے ہیں کہ وہ اصل پر ایک نظر ڈالیں اور اس کا ترجمہ کے ساتھ موازنہ کریں، اگر وہ کسی چیز کو غلط سمجھتے ہیں یا اس کا غلط ترجمہ کرتے ہیں۔ پہلے سے شکریہ. کسی بھی انٹرویو میں، سینئر یا جونیئر، تجربہ کار یا ابتدائی، آپ کو تھریڈز، متوازی اور ملٹی تھریڈنگ کے بارے میں چند سوالات کا سامنا کرنا پڑے گا۔ درحقیقت، کنکرنسی کے لیے یہ بلٹ ان سپورٹ جاوا کی سب سے بڑی طاقتوں میں سے ایک ہے اور اس نے اسے کاروباریوں اور پروگرامرز کے درمیان یکساں مقبولیت حاصل کرنے میں مدد کی ہے۔ زیادہ تر منافع بخش جاوا ڈویلپر پوزیشنوں کے لیے بہترین ملٹی تھریڈنگ کی مہارتوں اور ترقی، ڈیبگنگ، اور اعلی کارکردگی، کم تاخیر والی ایپلی کیشنز کو ٹیوننگ کرنے کا تجربہ درکار ہوتا ہے۔ لہذا، یہ انٹرویو میں سب سے زیادہ مطلوب مہارتوں میں سے ایک ہے. جاوا کے ایک عام انٹرویو میں، انٹرویو لینے والا آہستہ آہستہ تھریڈز کے بنیادی تصورات کے ساتھ شروع کرتا ہے، سوالات پوچھتا ہے جیسے تھریڈز کی ضرورت کیوں ہے، انہیں کیسے بنایا جائے، انہیں بنانے کا کون سا طریقہ بہتر ہے، تھریڈ سے وراثت میں ملنا یا Runnable کو لاگو کرنا، اور پھر آہستہ آہستہ آگے بڑھتا ہے۔ ہم آہنگی کی مشکلات پر، متوازی ایپلی کیشنز کی ترقی میں پیش آنے والی مشکلات، JDK 1.5 میں متعارف کرائی گئی اعلی سطحی ہم آہنگی کی افادیت، متوازی ایپلی کیشنز کے اصول اور ڈیزائن پیٹرن، اور کلاسک ملٹی تھریڈنگ کے مسائل۔ کیونکہ صرف ملٹی تھریڈنگ کی بنیادی باتوں کو جاننا کافی نہیں ہے، اس لیے آپ کو یہ جاننا چاہیے کہ ہم آہنگی کے مسائل جیسے کہ تعطل، دوڑ کے حالات، میموری کی عدم مطابقت، اور تھریڈ سیفٹی کے مختلف مسائل سے کیسے نمٹا جائے۔ ان مہارتوں کو اچھی طرح جانچا جاتا ہے، مختلف ملٹی تھریڈنگ اور کنکرنسی چیلنجز پیش کرتے ہیں۔ جاوا کے بہت سے ڈویلپرز عام طور پر انٹرویو سے پہلے صرف سوالات پڑھتے ہیں، جو کوئی بری چیز نہیں ہے، لیکن آپ کو یہ سمجھنا چاہیے۔ اس کے علاوہ، سوالات جمع کرنے اور وہی مشقیں کرنے میں بہت وقت ضائع ہوتا ہے، اس لیے میں نے یہ فہرست بنائی۔
  1. جاوا میں تھریڈ کیا ہے؟

  2. ایک دھاگہ ایک آزاد عملدرآمد کا راستہ ہے۔ اس کا مقصد مشین میں دستیاب متعدد پروسیسرز سے فائدہ اٹھانا ہے۔ متعدد دھاگوں کا استعمال کرکے، آپ CPU سے منسلک کاموں کو تیز کر سکتے ہیں۔ مثال کے طور پر، اگر ایک تھریڈ کسی کام کو مکمل کرنے میں 100 ملی سیکنڈ لیتا ہے، تو آپ اس کام کو 10 ملی سیکنڈ تک کم کرنے کے لیے 10 تھریڈز استعمال کر سکتے ہیں۔ جاوا زبان کی سطح پر ملٹی تھریڈنگ کے لیے بہترین معاونت فراہم کرتا ہے اور یہ اس کے مضبوط ترین فوائد میں سے ایک ہے۔
  3. جاوا میں دھاگوں اور عمل کے درمیان فرق؟

  4. ایک دھاگہ ایک عمل کا سب سیٹ ہے؛ دوسرے لفظوں میں، ایک عمل میں بہت سے دھاگے شامل ہو سکتے ہیں۔ دونوں عمل مختلف میموری کی جگہوں پر چل رہے ہیں، لیکن تمام تھریڈز ایک ہی میموری کی جگہ کا اشتراک کرتے ہیں۔ اس کو اسٹیک میموری کے ساتھ الجھائیں، جو ہر تھریڈ کے لیے مختلف ہوتی ہے اور اس تھریڈ کے مقامی ڈیٹا کو اسٹور کرنے کے لیے استعمال ہوتی ہے۔
  5. تھریڈ کیسے بنایا جائے؟

  6. زبان کی سطح پر، تھریڈ بنانے کے دو طریقے ہیں۔ java.lang.Thread کلاس کا ایک آبجیکٹ تھریڈ کی نمائندگی کرتا ہے، لیکن اسے چلانے کے لیے ایک ٹاسک کی ضرورت ہوتی ہے، جو کہ ایک ایسی چیز ہے جو java.lang.Runnable انٹرفیس کو نافذ کرتی ہے۔ چونکہ تھریڈ کلاس رن ایبل انٹرفیس کو نافذ کرتی ہے، اس لیے آپ اپنی کلاس کو تھریڈ سے اخذ کرکے یا اس میں رن ایبل انٹرفیس کو لاگو کرکے run() طریقہ کو اوور رائڈ کرسکتے ہیں۔
  7. رن ایبل کب استعمال کریں اور تھریڈ کب استعمال کریں؟

  8. یہ پچھلے سوال میں اضافہ ہے۔ جیسا کہ ہم جانتے ہیں، تھریڈ کلاس سے وراثت حاصل کرکے یا رن ایبل انٹرفیس کو لاگو کرکے تھریڈ بنایا جاسکتا ہے۔ سوال یہ پیدا ہوتا ہے کہ کون سا طریقہ بہتر ہے اور کون سا کب استعمال کیا جائے؟ اس سوال کا جواب دینا آسان ہے اگر آپ جانتے ہیں کہ جاوا متعدد کلاس وراثت کی حمایت نہیں کرتا ہے لیکن آپ کو متعدد انٹرفیس کو لاگو کرنے کی اجازت دیتا ہے۔ جس کا مطلب ہے کہ اگر آپ کسی اور کلاس سے وراثت میں جانا چاہتے ہیں تو Runnable کو نافذ کرنا بہتر ہے۔
  9. start() اور run() طریقوں میں فرق؟

  10. ماضی کے چال سوالات میں سے ایک، لیکن یہ جاوا میں ملٹی تھریڈنگ کی سطحی تفہیم کو الگ کرنے کے لیے اب بھی کافی اچھا ہے۔ start() طریقہ نیا تھریڈ شروع کرنے کے لیے استعمال کیا جاتا ہے۔ اگرچہ start() اندرونی طور پر run() طریقہ کو کال کرتا ہے، لیکن یہ صرف run() کو کال کرنے جیسا نہیں ہے۔ اگر آپ run() کو نارمل طریقہ کے طور پر کال کرتے ہیں تو اسے اسی تھریڈ پر کال کیا جاتا ہے اور کوئی نیا تھریڈ شروع نہیں کیا جائے گا، جب آپ start() طریقہ کو کال کرتے ہیں تو ایسا ہی ہوتا ہے۔
  11. رن ایبل اور کال ایبل کے درمیان فرق؟

  12. دونوں انٹرفیس ان کاموں کی نمائندگی کرتے ہیں جن کا مقصد علیحدہ تھریڈز میں انجام دیا جانا ہے۔ رن ایبل JDK 1.0 کے بعد سے ہے، اور Callable کو JDK 1.5 میں شامل کیا گیا تھا۔ بنیادی فرق یہ ہے کہ کال ایبل کا کال() طریقہ اقدار کو واپس کرسکتا ہے اور مستثنیات پھینک سکتا ہے، جو کہ Runnable کے run() طریقہ سے ممکن نہیں ہے۔ کال ایبل ایک مستقبل کی چیز لوٹاتا ہے جس میں حساب کا نتیجہ ہو سکتا ہے۔
  13. CyclicBarrier اور CountDownLatch کے درمیان فرق؟

  14. اگرچہ یہ دونوں سنکرونائزر تھریڈز کو ایک دوسرے کا انتظار کرنے دیتے ہیں، ان کے درمیان بنیادی فرق یہ ہے کہ آپ CountDownLatch کے کاؤنٹر کے صفر تک پہنچنے کے بعد اسے دوبارہ استعمال نہیں کر سکتے، لیکن آپ رکاوٹ ٹوٹنے کے بعد بھی دوبارہ CyclicBarrier استعمال کر سکتے ہیں۔
  15. جاوا میموری ماڈل کیا ہے؟

  16. میموری ماڈل اصولوں اور رہنما خطوط کا ایک مجموعہ ہے جو جاوا پروگراموں کو متعدد میموری، پروسیسر اور آپریٹنگ سسٹم کے فن تعمیر میں متعین طور پر کام کرنے کی اجازت دیتا ہے۔ ملٹی فلیمینٹ کے معاملے میں یہ خاص طور پر اہم ہے۔ میموری ماڈل اس بات کی گارنٹی فراہم کرتا ہے کہ ایک تھریڈ کی طرف سے کی گئی تبدیلیاں دوسروں کو نظر آئیں گی، ان میں سے ایک ہے ہونے سے پہلے کا رشتہ۔ یہ تعلق کئی اصولوں کی وضاحت کرتا ہے جو پروگرامرز کو متوازی پروگراموں کے رویے کی توقع اور تعین کرنے کی اجازت دیتے ہیں۔ مثال کے طور پر ہوتا ہے - ضمانتوں سے پہلے:
    • تھریڈ میں ہر ایکشن اس تھریڈ میں ہر ایکشن سے پہلے ہوتا ہے جو پروگرام آرڈر میں ہوتا ہے، جسے پروگرام آرڈر رول بھی کہا جاتا ہے۔
    • مانیٹر کو غیر مقفل کرنا اسی مانیٹر کے ہر بعد والے لاک سے پہلے ہوتا ہے، جسے مانیٹر لاک رول بھی کہا جاتا ہے۔
    • اتار چڑھاؤ والے فیلڈ کو لکھنا اس فیلڈ کے ہر بعد کے پڑھنے سے پہلے ہوتا ہے، ایک غیر مستحکم متغیر اصول۔
    • کسی تھریڈ پر Thread.start() کو کال اس سے پہلے ہوتی ہے جب کسی دوسرے تھریڈ کو یہ معلوم ہو کہ تھریڈ روک دیا گیا ہے، یا تو Thread.join() کے کامیاب ہونے کے بعد، یا Thread.isAlive() غلط لوٹنے کے بعد، Thread.start() اصول .
    • کسی دوسرے دھاگے کے ذریعے رکاوٹ پیدا ہونے والا دھاگہ اس سے پہلے ہوتا ہے کہ وہ رکاوٹ کا نوٹس لے (یا تو ایک InterruptedException پھینکنے سے یا isInterrupted() چیک کرنے سے)، تھریڈ کا رکاوٹ کا اصول۔
    • کسی آبجیکٹ کے کنسٹرکٹر کا اختتام اس آبجیکٹ کے فائنلائزر کے آغاز سے پہلے ہوتا ہے، فائنلائزر اصول۔
    • اگر A B سے پہلے ہوتا ہے، اور B C سے پہلے ہوتا ہے، تو A C سے پہلے ہوتا ہے، جس کا مطلب ہوتا ہے- اس سے پہلے کہ منتقلی کی ضمانت دیتا ہے۔
  17. ایک غیر مستحکم متغیر کیا ہے؟

  18. اتار چڑھاؤ ایک خاص ترمیم کنندہ ہے جو صرف صفات پر لاگو کیا جا سکتا ہے۔ متوازی جاوا پروگراموں میں، صفات پر مختلف دھاگوں کی طرف سے کی گئی تبدیلیاں مطابقت پذیر کی غیر موجودگی میں دوسروں کو نظر نہیں آتی ہیں۔ ایک غیر مستحکم متغیر اس بات کو یقینی بناتا ہے کہ ایک تحریر بعد میں پڑھنے سے پہلے واقع ہو، جیسا کہ پچھلے سوال میں وولیٹائل متغیر اصول میں بتایا گیا ہے۔
  19. تھریڈ سیفٹی کیا ہے؟ کیا ویکٹر کلاس محفوظ ہے؟

  20. تھریڈ سیفٹی کسی شے یا کوڈ کی خاصیت ہے جو اس بات کو یقینی بناتی ہے کہ جب ایک سے زیادہ تھریڈز کے ذریعے عمل یا استعمال کیا جائے تو کوڈ حسب منشا برتاؤ کرے گا۔ مثال کے طور پر، ایک تھریڈ سیف کاؤنٹر کسی بھی شمار کو نہیں چھوڑے گا اگر ایک ہی کاؤنٹر مثال کو متعدد تھریڈز میں استعمال کیا جائے۔ ظاہر ہے، کلیکشن کلاسز کو دو قسموں میں تقسیم کیا جا سکتا ہے، تھریڈ سیف اور نان تھریڈ سیف۔ ویکٹر تھریڈ سے محفوظ ہے اور اس کو ہم آہنگی کے طریقوں سے حاصل کرتا ہے جو ویکٹر کی حالت کو تبدیل کرتے ہیں، دوسری طرف اس کا ہم منصب ArrayList تھریڈ سے محفوظ نہیں ہے۔
  21. ریس کی شرط کیا ہے؟

  22. دوڑ کے حالات ٹھیک ٹھیک کیڑے کی وجہ ہیں. جیسا کہ نام ہی کہتا ہے، ایک دوڑ کی حالت متعدد دھاگوں کے درمیان ہونے والی دوڑ کی وجہ سے ہوتی ہے؛ اگر وہ دھاگہ جس پر پہلے عمل درآمد کیا جانا چاہیے وہ ریس ہار جاتا ہے اور دوسری کو پھانسی دے دی جاتی ہے، تو کوڈ کا رویہ تبدیل ہو جاتا ہے، جس سے غیر متعین کیڑے پیدا ہوتے ہیں۔ یہ دھاگوں کے درمیان ریس کی گندی نوعیت کی وجہ سے پکڑنے اور دوبارہ پیدا کرنے کے لئے کچھ مشکل ترین کیڑے ہیں۔ ریس کی حالت کی ایک مثال بے ترتیب عمل ہے۔
  23. تھریڈ کو کیسے روکا جائے؟

  24. میں نے ہمیشہ کہا ہے کہ جاوا ہر چیز کے لیے بھرپور API فراہم کرتا ہے، لیکن ستم ظریفی یہ ہے کہ تھریڈ کو روکنے کے لیے آسان طریقے فراہم نہیں کرتا ہے۔ JDK 1.0 میں کنٹرول کے کئی طریقے تھے، جیسے stop(), suspend(), اور resume(), جنہیں ممکنہ تعطل کے خطرات کی وجہ سے مستقبل کی ریلیز میں فرسودہ کے طور پر نشان زد کیا گیا تھا؛ تب سے، Java API ڈویلپرز نے تھریڈ فراہم کرنے کی کوئی کوشش نہیں کی ہے۔ مزاحم - تھریڈز کو روکنے کا ایک محفوظ اور خوبصورت طریقہ۔ پروگرامرز زیادہ تر اس حقیقت پر انحصار کرتے ہیں کہ جیسے ہی یہ رن() یا کال() طریقوں پر عمل درآمد مکمل کرتا ہے تھریڈ خود کو روک دیتا ہے۔ دستی طور پر روکنے کے لیے، پروگرامرز اتار چڑھاؤ والے بولین متغیر سے فائدہ اٹھاتے ہیں اور ہر تکرار میں اس کی قدر کو چیک کرتے ہیں کہ آیا رن() طریقہ میں لوپ ہیں، یا اچانک نوکریوں کو منسوخ کرنے کے لیے interrupt() طریقہ کے ساتھ تھریڈز کو روکتے ہیں۔
  25. کیا ہوتا ہے جب کوئی تھریڈ مستثنیٰ پھینک دیتا ہے؟

  26. یہ ان اچھی چال سوالات میں سے ایک ہے۔ سادہ الفاظ میں، اگر استثنیٰ نہیں پکڑا جاتا ہے، تو دھاگہ ختم ہو جاتا ہے؛ اگر غیر پکڑے گئے استثناء کے لیے ایک ہینڈلر انسٹال ہوتا ہے، تو اسے کال بیک موصول ہوگا۔ Thread.UncaughtExceptionHandler ایک انٹرفیس ہے جسے ہینڈلرز کے لیے ایک نیسٹڈ انٹرفیس کے طور پر بیان کیا جاتا ہے جسے اس وقت کہا جاتا ہے جب کوئی دھاگہ کسی غیر پکڑے گئے استثنا کی وجہ سے اچانک رک جاتا ہے۔ جب کوئی دھاگہ غیر پکڑے گئے استثناء کی وجہ سے مرنے والا ہوتا ہے، تو JVM Thread.getUncaughtExceptionHandler() کا استعمال کرتے ہوئے UncaughtExceptionHandler کی موجودگی کی جانچ کرے گا اور ہینڈلر کے uncaughtException() طریقہ کو کال کرے گا، دھاگے اور استثنیٰ کو دلائل کے طور پر پاس کرے گا۔
  27. دو تھریڈز کے درمیان ڈیٹا کیسے شیئر کیا جائے؟

  28. آپ مشترکہ آبجیکٹ یا متوازی ڈیٹا ڈھانچے جیسے بلاکنگ کیو کا استعمال کرتے ہوئے تھریڈز کے درمیان ڈیٹا کا اشتراک کر سکتے ہیں۔
  29. مطلع کرنے اور سب کو اطلاع دینے کے درمیان فرق؟

  30. یہ ایک اور مشکل سوال ہے، چونکہ ایک مانیٹر کو متعدد تھریڈز کے ذریعے مانیٹر کیا جا سکتا ہے، جاوا API کے ڈویلپرز اس کی حالت میں تبدیلی کے صرف ایک یا تمام تھریڈز کو مطلع کرنے کا طریقہ فراہم کرتے ہیں، لیکن وہ صرف نصف عمل درآمد فراہم کرتے ہیں۔ notify() طریقہ میں کسی مخصوص تھریڈ کو منتخب کرنے کا کوئی طریقہ نہیں ہے، اس لیے یہ تبھی مفید ہے جب آپ کو یقین ہو کہ صرف ایک تھریڈ انتظار کر رہا ہے۔ دوسری طرف، notifyAll() تمام تھریڈز کو مطلع کرتا ہے اور انہیں مانیٹر کے لیے مقابلہ کرنے کی اجازت دیتا ہے، جو اس بات کو یقینی بناتا ہے کہ کم از کم ایک تھریڈ آگے بڑھے۔
  31. کیوں انتظار کریں، مطلع کریں اور مطلع کریں سب تھریڈ کلاس میں نہیں ہیں؟

  32. یہ ایک ڈیزائن کا سوال ہے جو جانچتا ہے کہ امیدوار موجودہ سسٹمز کے بارے میں کیا سوچتا ہے یا اس نے کبھی ایسی ہی کسی چیز کے بارے میں سوچا ہے جو پہلے جگہ سے باہر نظر آتا ہے۔ اس سوال کا جواب دینے کے لیے، آپ کو کئی وجوہات فراہم کرنے کی ضرورت ہے کیوں کہ ان طریقوں کو آبجیکٹ کلاس میں بہتر طریقے سے لاگو کیا جاتا ہے، اور تھریڈ کلاس میں کیوں نہیں۔ پہلی واضح وجہ یہ ہے کہ جاوا دھاگے کی سطح پر نہیں بلکہ آبجیکٹ کی سطح پر تالے کو سپورٹ کرتا ہے۔ کسی بھی چیز کا ایک تالا ہوتا ہے، جو دھاگے سے حاصل ہوتا ہے۔ اور اگر کسی تھریڈ کو کسی خاص لاک کے لیے انتظار کرنے کی ضرورت ہو، تو اس تھریڈ کی بجائے کسی چیز پر wait() کو کال کرنا زیادہ سمجھ میں آتا ہے۔ اگر تھریڈ کلاس میں انتظار () کا اعلان کیا گیا تو یہ واضح نہیں ہوگا کہ تھریڈ کس لاک پر انتظار کر رہا ہے۔ مختصراً، چونکہ wait, notify اور notifyAll لاک لیول پر کام کرتے ہیں، اس لیے انہیں آبجیکٹ کلاس میں ڈکلیئر کرنا زیادہ آسان ہے کیونکہ لاک سے مراد کسی چیز کا ہے۔
  33. ThreadLocal متغیر کیا ہے؟

  34. ThreadLocal متغیر جاوا پروگرامر کے لیے دستیاب ایک خاص قسم کے متغیر ہیں۔ جس طرح ریاستوں کا اسٹیٹ متغیر ہوتا ہے، اسی طرح تھریڈز میں ThreadLocal متغیر ہوتے ہیں۔ مہنگی سے تخلیق کرنے والی اشیاء کے لیے تھریڈ سیفنس حاصل کرنے کا یہ ایک اچھا طریقہ ہے؛ مثال کے طور پر، آپ ThreadLocal استعمال کرکے SimpleDateFormat کو تھریڈ سے محفوظ بنا سکتے ہیں۔ چونکہ یہ ایک مہنگی کلاس ہے، اس لیے اسے مقامی دائرہ کار میں استعمال کرنا مناسب نہیں ہے جس کے لیے ہر کال کے لیے الگ الگ مثالوں کی ضرورت ہوتی ہے۔ ہر تھریڈ کو اس کی اپنی کاپی دے کر، آپ ایک پتھر سے دو پرندے مارتے ہیں۔ سب سے پہلے، آپ مثالوں کی ایک نئی مقررہ تعداد کا استعمال کرکے مہنگی اشیاء کی مثالوں کی تعداد کو کم کرتے ہیں، اور دوم، آپ مطابقت پذیری اور عدم تغیر کو کھوئے بغیر تھریڈ کی حفاظت حاصل کرتے ہیں۔ تھریڈ لوکل متغیر کی ایک اور اچھی مثال ThreadLocalRandom کلاس ہے، جو ملٹی تھریڈڈ ماحول میں مہنگے سے بنانے والی رینڈم آبجیکٹ کی مثالوں کی تعداد کو کم کرتی ہے۔
  35. FutureTask کیا ہے؟

  36. FutureTask متوازی جاوا ایپلیکیشن میں ایک منسوخی قابل مطابقت پذیر کمپیوٹیشن ہے۔ یہ کلاس ایک بنیادی مستقبل کا نفاذ فراہم کرتی ہے، جس میں حساب کتاب شروع کرنے اور روکنے کے طریقے، حساب کی حالت کے بارے میں استفسار کرنے کے طریقے، اور نتائج کی بازیافت ہوتی ہے۔ نتیجہ صرف اس وقت حاصل کیا جا سکتا ہے جب حساب مکمل ہو جائے؛ اگر حساب ابھی مکمل نہیں ہوا ہے تو حاصل کرنے والا طریقہ بلاک ہو جائے گا۔ FutureTask آبجیکٹ کو کال ایبل اور رن ایبل اشیاء کو لپیٹنے کے لیے استعمال کیا جا سکتا ہے۔ چونکہ فیوچر ٹاسک رن ایبل کو لاگو کرتا ہے، اس لیے اسے ایگزیکیوٹر کے پاس بھیجا جا سکتا ہے۔
  37. مداخلت شدہ اور مداخلت شدہ کے درمیان فرق؟

  38. interrupted() اور isInterrupted() کے درمیان بنیادی فرق یہ ہے کہ سابقہ ​​مداخلت کی حیثیت کو دوبارہ ترتیب دیتا ہے جبکہ بعد والا ایسا نہیں کرتا ہے۔ جاوا میں مداخلت کا طریقہ کار ایک اندرونی پرچم کا استعمال کرتے ہوئے لاگو کیا جاتا ہے جسے مداخلت کی حیثیت کہا جاتا ہے۔ Thread.interrupt() کو کال کر کے دھاگے میں خلل ڈالنا یہ پرچم سیٹ کرتا ہے۔ جب کوئی مداخلت شدہ دھاگہ static Thread.interrupted() طریقہ کو کال کرکے مداخلت کی حیثیت کو چیک کرتا ہے، تو مداخلت کی حیثیت دوبارہ ترتیب دی جاتی ہے۔ غیر جامد isInterrupted() طریقہ، جو ایک تھریڈ کے ذریعے کسی دوسرے تھریڈ کی انٹرپٹ سٹیٹس کو چیک کرنے کے لیے استعمال کیا جاتا ہے، انٹرپٹ فلیگ کو تبدیل نہیں کرتا ہے۔ روایتی طور پر، کوئی بھی طریقہ جو InterruptedException پھینک کر ختم ہوتا ہے وہ interrupt فلیگ کو دوبارہ سیٹ کرتا ہے۔ تاہم، اس بات کا ہمیشہ امکان رہتا ہے کہ جھنڈا فوری طور پر دوبارہ ترتیب دیا جائے گا اگر کوئی اور دھاگہ interrupt() کال کرتا ہے۔
  39. سنکرونائزڈ بلاک میں انتظار اور اطلاع کے طریقوں کو کیوں کہا جاتا ہے؟

  40. جامد بلاک یا طریقہ سے انتظار کو کال کرنے اور مطلع کرنے کی بنیادی وجہ یہ ہے کہ جاوا API کو اس کی ضرورت ہے۔ اگر آپ انہیں مطابقت پذیر بلاک کے باہر سے کال کرتے ہیں، تو آپ کا کوڈ ایک IllegalMonitorStateException پھینک دے گا۔ ایک زیادہ ہوشیار وجہ انتظار اور مطلع کالوں کے درمیان دوڑ کی حالت سے بچنا ہے۔
  41. آپ کو انتظار کی حالت کو لوپ میں کیوں چیک کرنا چاہئے؟

  42. اس بات کا امکان ہے کہ ایک ویٹنگ تھریڈ کو غلط انتباہات اور جھوٹی ویک اپ کالیں موصول ہوں گی اگر وہ انتظار کی حالت کو ایک لوپ میں چیک نہیں کرتا ہے، تو یہ آسانی سے باہر نکل جائے گا چاہے سٹیٹ تک نہ پہنچ جائے۔ جب انتظار کا دھاگہ جاگتا ہے، تو وہ اس حقیقت کے بارے میں نہیں سوچتا کہ جس حالت کا اسے انتظار تھا وہ اب بھی نافذ ہو سکتی ہے۔ یہ حقیقت میں ماضی میں ہوسکتا ہے، لیکن پھر نوٹیفائی() طریقہ کو کال کرنے کے بعد اور تھریڈ کے بیدار ہونے سے پہلے تبدیل کر دیا گیا۔ اس لیے انتظار() کو لوپ کے اندر سے کال کرنا ہمیشہ بہتر ہے۔
  43. مطابقت پذیر اور سمورتی مجموعوں کے درمیان فرق؟

  44. جب کہ مطابقت پذیر اور ہم آہنگی دونوں مجموعے تھریڈ سے محفوظ مجموعہ فراہم کرتے ہیں، مؤخر الذکر زیادہ توسیع پذیر ہے۔ جاوا 1.5 سے پہلے، پروگرامرز کو صرف مطابقت پذیر مجموعوں تک رسائی حاصل تھی، جو اس وقت تنازعہ کا باعث بن گئے جب متعدد دھاگوں نے بیک وقت ان تک رسائی حاصل کی، جس سے سسٹم کو پیمانہ کرنا مشکل ہو گیا۔ جاوا 5 نے کنکرنٹ ہیش میپ جیسے کنکرنٹ کلیکشن متعارف کرائے، جو نہ صرف تھریڈ سیفٹی فراہم کرتے ہیں بلکہ جدید تکنیکوں جیسے لاک سٹرپنگ اور انٹرنل ٹیبل پارٹیشننگ کا استعمال کرتے ہوئے اسکیل ایبلٹی کو بھی بہتر بناتے ہیں۔
  45. اسٹیک اور ہیپ کے درمیان فرق؟

  46. ملٹی تھریڈنگ سے متعلق سوالات میں یہ سوال کیوں موجود ہے؟ کیونکہ اسٹیک میموری کا ایک ٹکڑا ہے جو تھریڈز سے قریب سے وابستہ ہے۔ ہر تھریڈ کا اپنا اسٹیک ہوتا ہے، جو مقامی متغیرات، طریقہ کار کے پیرامیٹرز اور کال اسٹیک کو اسٹور کرتا ہے۔ ایک دھاگے کے اسٹیک پر ذخیرہ شدہ متغیر دوسرے کو نظر نہیں آتا۔ دوسری طرف، ہیپ میموری کا ایک مشترکہ علاقہ ہے جو تمام دھاگوں میں مشترک ہے۔ آبجیکٹ، چاہے مقامی ہوں یا کسی اور سطح پر، ڈھیر پر بنائے جاتے ہیں۔ کارکردگی کو بہتر بنانے کے لیے، ایک دھاگہ عام طور پر ڈھیر سے اقدار کو اپنے اسٹیک پر محفوظ کرتا ہے، یہ وہ جگہ ہے جہاں غیر مستحکم متغیرات کام میں آتے ہیں۔ وولیٹائل تھریڈز کو مین میموری سے متغیر پڑھنے کو کہتا ہے۔
  47. تھریڈ پول کیا ہے؟

  48. دھاگہ بنانا وقت اور وسائل کے لحاظ سے مہنگا ہے۔ اگر آپ درخواست پر کارروائی کے دوران تھریڈ بناتے ہیں، تو اس سے رسپانس کا وقت کم ہو جائے گا، اور یہ عمل صرف محدود تعداد میں تھریڈز بنا سکتا ہے۔ ان مسائل سے بچنے کے لیے، درخواست کے آغاز پر تھریڈز کا ایک پول بنایا جاتا ہے اور درخواستوں پر کارروائی کے لیے تھریڈز کو دوبارہ استعمال کیا جاتا ہے۔ دھاگوں کے اس تالاب کو "تھریڈ پول" کہا جاتا ہے، اور اس میں موجود دھاگوں کو ورکر تھریڈ کہا جاتا ہے۔ جاوا 1.5 کے ساتھ شروع کرتے ہوئے، جاوا API ایگزیکیوٹر فریم ورک فراہم کرتا ہے، جو آپ کو مختلف تھریڈ پول بنانے کی اجازت دیتا ہے، جیسے کہ سنگل تھریڈ پول، جو فی یونٹ صرف ایک کام پر کارروائی کرتا ہے، ایک مقررہ تھریڈ پول، ایک مقررہ تعداد والا پول۔ دھاگوں کا، اور کیشڈ تھریڈ پول، ایک قابل توسیع پول۔ بہت سے قلیل المدتی کاموں والی ایپلیکیشنز کے لیے موزوں
  49. پروڈیوسر صارفین کا مسئلہ کیسے حل کیا جائے؟

  50. دھاگے کے زیادہ تر مسائل جو آپ حقیقت میں حل کرتے ہیں وہ پروڈیوسر کنزیومر پیٹرن سے ہوتے ہیں، جس میں ایک تھریڈ مسئلہ پیدا کرتا ہے اور دوسرا اسے استعمال کرتا ہے۔ آپ کو یہ جاننے کی ضرورت ہے کہ اس مسئلے کو حل کرنے کے لیے اندرونی دھاگے کے تعاملات کیسے بنائے جائیں۔ نچلی سطح پر آپ انتظار اور مطلع کرنے کے طریقوں سے فائدہ اٹھا سکتے ہیں، اور اعلیٰ سطح پر آپ Semaphore یا BlockingQueue سے فائدہ اٹھا سکتے ہیں۔
  51. تعطل سے کیسے بچا جائے؟

  52. ترجمہ: تھریڈ کے لحاظ سے انٹرویو کے 50 سرفہرست سوالات۔  حصہ 1. - 1 تعطل ایک ایسی حالت ہے جس میں ایک دھاگہ دوسرے دھاگے کے کچھ عمل کرنے کا انتظار کر رہا ہے، اور دوسرا، ایک ہی وقت میں، پہلے سے اسی کا انتظار کر رہا ہے۔ یہ ایک بہت سنگین مسئلہ ہے جس کی وجہ سے آپ کا پروگرام منجمد ہوجاتا ہے اور وہ نہیں کرتا جو اسے کرنے کے لیے بنایا گیا ہے۔ تعطل اس وقت ہوتا ہے جب یہ 4 ریاستیں پہنچ جاتی ہیں:
    • باہمی اخراج: ناقابل تقسیم موڈ میں کم از کم ایک وسائل پر قبضہ ہونا ضروری ہے۔ کسی بھی وقت صرف ایک عمل وسائل کا استعمال کرسکتا ہے۔
    • پکڑو اور انتظار کرو: ایک عمل میں کم از کم ایک وسیلہ ہوتا ہے اور وہ اضافی وسائل کی درخواست کرتا ہے جو دوسرے عمل کے پاس ہوتے ہیں۔
    • کوئی پری کلین اپ نہیں: آپریٹنگ سسٹم وسائل کو دوبارہ تفویض نہیں کرتا ہے اگر وہ پہلے سے ہی قابض ہیں، انہیں انعقاد کے عمل میں رضاکارانہ طور پر دیا جانا چاہیے۔
    • چکراتی انتظار: ایک عمل دوسرے عمل کے ذریعہ وسائل کے جاری ہونے کا انتظار کرتا ہے، جس کے نتیجے میں پہلے عمل کے ذریعہ وسائل کے جاری ہونے کا انتظار ہوتا ہے۔
    تعطل سے بچنے کا آسان ترین طریقہ یہ ہے کہ لوپ میں انتظار کرنے سے گریز کیا جائے؛ یہ ایک خاص ترتیب میں تالے حاصل کرکے اور انہیں الٹ ترتیب میں جاری کرکے حاصل کیا جاسکتا ہے۔
  53. لائیو لاک اور تعطل کے درمیان فرق؟

  54. لائیو لاک ڈیڈ لاک کی طرح ہوتا ہے، صرف لائیو لاک میں دھاگوں کی حالتیں یا اس میں شامل عمل ایک دوسرے پر منحصر ہوتے ہوئے مسلسل تبدیل ہوتے رہتے ہیں۔ لائیو لاک وسائل کی کمی کا ایک خاص معاملہ ہے۔ لائیو لاک کی ایک حقیقی مثال یہ ہے کہ جب دو لوگ ایک تنگ راہداری میں ملتے ہیں اور ہر ایک، شائستہ ہونے کی کوشش کرتا ہے، ایک طرف ہٹ جاتا ہے، اور اس طرح وہ لامتناہی طور پر ایک دوسرے سے دوسری طرف بڑھتے ہیں۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION