JavaRush /جاوا بلاگ /Random-UR /جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔ حص...

جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔ حصہ 12

گروپ میں شائع ہوا۔
ہیلو! علم طاقت ہے. اپنے پہلے انٹرویو سے پہلے آپ کے پاس جتنا زیادہ علم ہوگا، اتنا ہی زیادہ اعتماد آپ اس پر محسوس کریں گے۔ جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 12 - 1اچھی معلومات کے ساتھ، آپ کو الجھانا مشکل ہو جائے گا، اور ساتھ ہی آپ اپنے انٹرویو لینے والے کو خوشگوار حیرت میں ڈالنے کے قابل ہو جائیں گے۔ لہذا، آج، مزید اڈو کے بغیر، ہم جاوا ڈویلپر کے لیے 250+ سوالات کی جانچ کرکے آپ کی نظریاتی بنیاد کو مضبوط کرنا جاری رکھیں گے ۔ جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 12 - 2

103. وراثت میں مستثنیات کو چیک کرنے کے کیا اصول ہیں؟

اگر میں سوال کو صحیح طور پر سمجھتا ہوں، تو وہ وراثت کے دوران مستثنیات کے ساتھ کام کرنے کے قواعد کے بارے میں پوچھ رہے ہیں، اور وہ درج ذیل ہیں:
  • ڈیسنڈنٹ/عمل درآمد میں اوور رائیڈڈ یا نافذ شدہ طریقہ چیک شدہ استثناءات کو نہیں پھینک سکتا جو سپر کلاس/انٹرفیس طریقہ میں مستثنیات سے زیادہ درجہ بندی میں ہیں۔
یعنی، اگر ہمارے پاس ایک مخصوص اینیمل انٹرفیس ہے جس میں ایک طریقہ ہے جو IOException پھینکتا ہے :
public  interface Animal {
   void voice() throws IOException;
}
اس انٹرفیس کے نفاذ میں، ہم زیادہ عمومی طور پر پھینکی گئی رعایت (مثال کے طور پر، Exception , Throwable ) نہیں ڈال سکتے، لیکن ہم اسے ایک نسلی استثناء سے بدل سکتے ہیں، جیسے FileNotFoundException :
public class Cat implements Animal {
   @Override
   public void voice() throws FileNotFoundException {
// некоторая реализация
   }
}
  • ذیلی کلاس کنسٹرکٹر کو اپنے تھرو میں شامل تمام استثنائی کلاسوں کو شامل کرنا چاہئے جو سپرکلاس کنسٹرکٹر کے ذریعہ پھینکے گئے ہیں جن کو آبجیکٹ بناتے وقت پکارا جاتا ہے۔
فرض کریں کہ اینیمل کلاس کا کنسٹرکٹر بہت زیادہ مستثنیات پھینکتا ہے:
public class Animal {
  public Animal() throws ArithmeticException, NullPointerException, IOException {
  }
پھر کلاس کے وارث کو بھی کنسٹرکٹر میں ان کی نشاندہی کرنا ہوگی:
public class Cat extends Animal {
   public Cat() throws ArithmeticException, NullPointerException, IOException {
       super();
   }
یا، جیسا کہ طریقوں کے معاملے میں، آپ ایک ہی مستثنیات کی وضاحت نہیں کر سکتے ہیں، لیکن زیادہ عام ہیں۔ ہمارے معاملے میں، زیادہ عام استثناء کی وضاحت کرنا کافی ہوگا - Exception ، کیونکہ یہ تینوں مستثنیات کا مشترک اجداد سمجھا جاتا ہے:
public class Cat extends Animal {
   public Cat() throws Exception {
       super();
   }

104. کیا آپ اس کے لیے کوڈ لکھ سکتے ہیں جب آخر میں بلاک پر عمل نہیں کیا جائے گا؟

سب سے پہلے، یاد رکھیں کہ آخر کیا ہے ؟ پہلے، ہم نے مستثنیات کو پکڑنے کے طریقہ کار کو دیکھا: ٹرائی بلاک کیچنگ ایریا کا خاکہ پیش کرتا ہے، جب کہ کیچ بلاک (زبانیں) وہ کوڈ ہے جو کسی مخصوص استثنا کو پھینکنے پر کام کرے گا۔ آخر میں آخر کے بعد کوڈ کا تیسرا بلاک ہے جو کیچ کے ساتھ تبادلہ ہوتا ہے لیکن باہمی طور پر خصوصی نہیں ہوتا ہے۔ اس بلاک کا جوہر یہ ہے کہ اس میں موجود کوڈ ہمیشہ کام کرتا ہے، قطع نظر اس کے کہ کوشش یا کیچ کا نتیجہ کچھ بھی ہو (اس بات سے قطع نظر کہ کوئی استثناء پھینکا گیا تھا یا نہیں)۔ اس کی ناکامی کے معاملات بہت کم ہوتے ہیں اور وہ غیر معمولی ہیں۔ ناکامی کی سب سے آسان صورت وہ ہے جب اوپر والے کوڈ میں System.exit(0) طریقہ کو کال کیا جاتا ہے ، جو پروگرام کو ختم کرتا ہے (اسے بجھا دیتا ہے):
try {
   throw new IOException();
} catch (IOException e) {
   System.exit(0);
} finally {
   System.out.println("Данное сообщение не будет выведенно в консоль");
}
کچھ دوسرے حالات بھی ہیں جن میں آخر کار کام نہیں کریں گے:
  • سسٹم کے اہم مسائل کی وجہ سے پروگرام کا غیر معمولی خاتمہ، یا کچھ ایرر کا گرنا جو ایپلیکیشن کو "کریش" کر دے گا (خرابی کی مثال وہی StackOwerflowError ہو سکتی ہے جو اسٹیک میموری کے اوور فلو ہونے پر ہوتی ہے)۔
  • جب ڈیمون تھریڈ ry سے گزرتا ہے ... آخر میں بلاک کرتا ہے اور اس کے ساتھ ساتھ پروگرام ختم ہوجاتا ہے۔ بہر حال، ڈیمن تھریڈ پس منظر کی کارروائیوں کے لیے ایک دھاگہ ہے، یعنی یہ کوئی ترجیح اور لازمی نہیں ہے، اور ایپلیکیشن اپنے کام کے ختم ہونے کا انتظار نہیں کرے گی۔
  • سب سے عام لامحدود لوپ، کوشش یا کیچ میں ، ایک بار جس میں بہاؤ ہمیشہ کے لیے موجود رہے گا:

    try {
       while (true) {
       }
    } finally {
       System.out.println("Данное сообщение не будет выведенно в консоль");
    }

یہ سوال نئے آنے والوں کے انٹرویوز میں کافی مقبول ہے، اس لیے ان میں سے کچھ غیر معمولی حالات یاد رکھنے کے قابل ہیں۔ جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 12 - 3

105. ایک کیچ بلاک میں متعدد استثنیٰ کو سنبھالنے کی ایک مثال لکھیں۔

1) شاید سوال غلط پوچھا گیا تھا۔ جہاں تک میں سمجھتا ہوں، اس سوال کا مطلب ہےایک کوشش بلاک کے لیے متعدد کیچز :
try {
  throw new FileNotFoundException();
} catch (FileNotFoundException e) {
   System.out.print("Упс, у вас упало исключение - " + e);
} catch (IOException e) {
   System.out.print("Упс, у вас упало исключение - " + e);
} catch (Exception e) {
   System.out.print("Упс, у вас упало исключение - " + e);
}
اگر ٹرائی بلاک میں کوئی استثناء ہوتا ہے ، تو کیچ بلاکس باری باری اسے اوپر سے نیچے تک پکڑنے کی کوشش کرتے ہیں۔ اگر کوئی خاص کیچ بلاک کامیاب ہو جاتا ہے، تو اسے استثناء کو ہینڈل کرنے کا حق مل جاتا ہے، جبکہ نیچے کے باقی بلاکس مزید نہیں ہوں گے۔ اسے پکڑنے اور اپنے طریقے سے اس پر کارروائی کرنے کی کوشش کرنے کے قابل۔ لہذا، کیچ بلاک چین میں تنگ مستثنیات کو اونچا رکھا جاتا ہے ، اور وسیع تر مستثنیات کو نیچے رکھا جاتا ہے۔ مثال کے طور پر، اگر ہمارے پہلے کیچ بلاک میں Exception class کا کوئی استثناء پکڑا جاتا ہے ، تو چیک شدہ استثناء باقی بلاکس میں داخل نہیں ہو سکیں گے ( exception descendants کے ساتھ باقی بلاکس بالکل بیکار ہوں گے)۔ 2) سوال درست طریقے سے پوچھا گیا تھا۔ اس صورت میں، ہماری پروسیسنگ اس طرح نظر آئے گی:
try {
  throw new NullPointerException();
} catch (Exception e) {
   if (e instanceof FileNotFoundException) {
       // некоторая обработка с сужением типа (FileNotFoundException)e
   } else if (e instanceof ArithmeticException) {
       // некоторая обработка с сужением типа (ArithmeticException)e
   } else if(e instanceof NullPointerException) {
       // некоторая обработка с сужением типа (NullPointerException)e
   }
catch کے ذریعے ایک استثناء کو پکڑنے کے بعد ، ہم instanceof طریقہ کے ذریعے اس کی مخصوص قسم معلوم کرنے کی کوشش کرتے ہیں ، جس کا استعمال یہ جانچنے کے لیے کیا جاتا ہے کہ آیا کوئی چیز کسی خاص قسم سے تعلق رکھتی ہے، تاکہ بعد میں ہم اسے منفی نتائج کے بغیر اس قسم تک محدود کر سکیں۔ دونوں سمجھے جانے والے نقطہ نظر کو ایک ہی صورت حال میں استعمال کیا جا سکتا ہے، لیکن میں نے کہا کہ سوال غلط ہے کیونکہ میں دوسرے آپشن کو اچھا نہیں کہوں گا اور اسے اپنی پریکٹس میں کبھی نہیں دیکھا، جبکہ ایک ہی وقت میں ملٹی کیچز کے ساتھ پہلے طریقہ کو بڑے پیمانے پر پذیرائی ملی ہے۔ توجہ. پھیلانا. جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 12 - 4

106. کون سا آپریٹر آپ کو استثنیٰ پر مجبور کرنے کی اجازت دیتا ہے؟ ایک مثال لکھیں۔

میں اسے پہلے ہی اوپر کئی بار استعمال کر چکا ہوں، لیکن اس کے باوجود میں اس کلیدی لفظ کو دہراؤں گا - throw ۔ استعمال کی مثال (استثنیٰ پر مجبور کرنا):
throw new NullPointerException();

107. کیا مرکزی طریقہ تھرو کی رعایت پھینک سکتا ہے؟ اگر ایسا ہے تو اسے کہاں منتقل کیا جائے گا؟

سب سے پہلے، میں یہ نوٹ کرنا چاہتا ہوں کہ main ایک باقاعدہ طریقہ سے زیادہ کچھ نہیں ہے، اور ہاں، اسے ورچوئل مشین کے ذریعے پروگرام پر عمل درآمد شروع کرنے کے لیے کہا جاتا ہے، لیکن اس کے علاوہ، اسے کسی دوسرے کوڈ سے بھی بلایا جا سکتا ہے۔ یعنی، یہ تھرو کے بعد چیک شدہ مستثنیات کی وضاحت کے لیے بھی معمول کے اصولوں کے تابع ہے :
public static void main(String[] args) throws IOException {
اس کے مطابق اس میں استثناء بھی ہو سکتا ہے۔ اگر main کو کسی طریقے سے نہیں بلایا گیا تھا، لیکن ایک پروگرام لانچ پوائنٹ کے طور پر شروع کیا گیا تھا، تو اس کی طرف سے پھینکی گئی رعایت کو .UncaughtExceptionHandler انٹرسیپٹر کے ذریعے ہینڈل کیا جائے گا ۔ یہ ہینڈلر فی تھریڈ ایک ہے (یعنی ہر تھریڈ میں ایک ہینڈلر)۔ اگر ضروری ہو تو، آپ اپنا ہینڈلر بنا سکتے ہیں اور اسے setDefaultUncaughtExceptionHandler طریقہ استعمال کرتے ہوئے ترتیب دے سکتے ہیں جسے Thread آبجیکٹ پر کہا جاتا ہے ۔

ملٹی تھریڈنگ

جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 12 - 5

108. ملٹی تھریڈنگ کے ساتھ کام کرنے کے لیے آپ کون سے ٹولز جانتے ہیں؟

جاوا میں ملٹی تھریڈنگ استعمال کرنے کے لیے بنیادی/بنیادی ٹولز:
  • Synchronized ایک طریقہ کار کو بند کرنے (مسدود کرنے) کا طریقہ ہے جب کوئی تھریڈ دوسرے تھریڈز سے داخل ہوتا ہے۔
  • اتار چڑھاؤ مختلف تھریڈز کے ذریعے متغیر تک مسلسل رسائی کو یقینی بنانے کا ایک طریقہ کار ہے، یعنی متغیر پر اس موڈیفائر کی موجودگی کے ساتھ، تمام تفویض اور پڑھنے کی کارروائیوں کا ایٹم ہونا ضروری ہے۔ دوسرے الفاظ میں، تھریڈز اس متغیر کو اپنی مقامی میموری میں کاپی نہیں کریں گے اور اسے تبدیل نہیں کریں گے، بلکہ اس کی اصل قدر کو تبدیل کر دیں گے۔
یہاں غیر مستحکم کے بارے میں مزید پڑھیں ۔
  • رن ایبل ایک انٹرفیس ہے جسے کسی خاص کلاس میں لاگو کیا جاسکتا ہے (خاص طور پر اس کے چلانے کا طریقہ)
public class CustomRunnable implements Runnable {
   @Override
   public void run() {
       // некоторая логика
   }
}
اور اس کلاس کا ایک آبجیکٹ بنانے کے بعد، آپ اس آبجیکٹ کو نئے تھریڈ آبجیکٹ کے کنسٹرکٹر میں سیٹ کرکے اور اس کے start() طریقہ کو کال کرکے ایک نیا تھریڈ شروع کرسکتے ہیں ۔
Runnable runnable = new CustomRunnable();
new Thread(runnable).start();
شروع کا طریقہ ایک الگ تھریڈ میں نافذ شدہ run() طریقہ کو چلاتا ہے ۔
  • تھریڈ ایک کلاس ہے، جس سے وراثت ملتی ہے ( رن طریقہ کو اوور رائیڈ کرتے ہوئے ):
public class CustomThread extends Thread {
   @Override
   public void run() {
       // некоторая логика
   }
}
اور اس کلاس کا ایک آبجیکٹ بنا کر اور start() طریقہ استعمال کرتے ہوئے اسے لانچ کر کے ، ہم اس طرح ایک نیا تھریڈ شروع کریں گے:
new CustomThread().start();
  • کنکرنسی ایک پیکج ہے جس میں ٹولز ملٹی تھریڈڈ ماحول میں کام کرنے کے لیے ہیں۔
یہ مشتمل ہے:
  • کنکرنٹ کلیکشنز - مجموعوں کا ایک مجموعہ جو کثیر تھریڈ والے ماحول میں کام کرنے کے لیے مخصوص ہے۔
  • قطاریں - کثیر دھاگے والے ماحول کے لیے مخصوص قطاریں (بلاکنگ اور نان بلاکنگ)۔
  • سنکرونائزرز کثیر دھاگے والے ماحول میں کام کرنے کے لیے خصوصی افادیت ہیں۔
  • ایگزیکیوٹرز تھریڈ پول بنانے کا طریقہ کار ہیں۔
  • تالے - تھریڈ سنکرونائزیشن میکانزم (معیاری سے زیادہ لچکدار - مطابقت پذیر، انتظار کریں، مطلع کریں، سبھی کو مطلع کریں)۔
  • ایٹمکس وہ کلاسز ہیں جو ملٹی تھریڈڈ ایگزیکیوشن کے لیے موزوں ہیں؛ ہر آپریشن ایٹم ہے۔
سمورتی پیکج کے بارے میں یہاں مزید پڑھیں ۔

109. دھاگوں کے درمیان ہم آہنگی کے بارے میں بات کریں۔ wait(), notify() - notifyAll() join() کے طریقے کس کے لیے استعمال کیے جاتے ہیں؟

جہاں تک میں سوال کو سمجھتا ہوں، دھاگوں کے درمیان مطابقت پذیری کلیدی موڈیفائر کے بارے میں ہے - synchronized ۔ یہ ترمیم کنندہ یا تو براہ راست بلاک کے آگے رکھا جا سکتا ہے:
synchronized (Main.class) {
   // некоторая логика
}
یا براہ راست طریقہ کے دستخط میں:
public synchronized void move() {
   // некоторая логика}
جیسا کہ میں نے پہلے کہا، سنکرونائز ایک ایسا طریقہ کار ہے جو آپ کو دوسرے تھریڈز سے بلاک/طریقہ بند کرنے کی اجازت دیتا ہے جب ایک تھریڈ پہلے ہی داخل ہو چکا ہو۔ ایک بلاک/طریقہ کو ایک کمرے کے طور پر سوچیں۔ کچھ نہریں اس کے پاس آکر اس میں داخل ہوں گی اور اسے تالا لگا دیں گی، دوسری نہریں کمرے میں آکر اسے بند دیکھ کر اس کے قریب انتظار کریں گی یہاں تک کہ وہ خالی ہوجائے۔ اپنا کاروبار کرنے کے بعد، پہلا دھاگہ کمرے سے نکلتا ہے اور چابی جاری کرتا ہے۔ اور یہ کچھ بھی نہیں تھا کہ میں نے مسلسل کلید کے بارے میں بات کی، کیونکہ یہ واقعی موجود ہے. یہ ایک خاص چیز ہے جس کی مصروف/آزاد حالت ہے۔ یہ آبجیکٹ ہر جاوا آبجیکٹ کے ساتھ منسلک ہوتا ہے، لہذا جب ہم وقت ساز بلاک کا استعمال کرتے ہوئے ہمیں قوسین میں اس چیز کی نشاندہی کرنے کی ضرورت ہوتی ہے جس کے mutex پر ہم دروازہ بند کرنا چاہتے ہیں:
Cat cat = new Cat();
synchronized (cat) {
   // некоторая логика
}
آپ کلاس mutex بھی استعمال کر سکتے ہیں، جیسا کہ میں نے پہلی مثال ( Main.class ) میں کیا تھا۔ جب ہم کسی طریقہ پر مطابقت پذیری کا استعمال کرتے ہیں ، تو ہم اس چیز کی وضاحت نہیں کرتے جس پر ہم بند کرنا چاہتے ہیں، ٹھیک ہے؟ اس صورت میں، ایک غیر جامد طریقہ کے لیے، یہ اس چیز کے mutex پر بند ہو جائے گا ، یعنی اس کلاس کی موجودہ آبجیکٹ۔ جامد موجودہ کلاس ( this.getClass(); ) کے mutex پر بند ہو جائے گا ۔ آپ یہاں mutex کے بارے میں مزید پڑھ سکتے ہیں ۔ ٹھیک ہے، یہاں مطابقت پذیری کے بارے میں پڑھیں ۔ Wait() ایک ایسا طریقہ ہے جو mutex کو جاری کرتا ہے اور موجودہ دھاگے کو اسٹینڈ بائی موڈ میں رکھتا ہے، جیسے کہ موجودہ مانیٹر سے منسلک ہو (اینکر کی طرح کچھ)۔ اس کی وجہ سے، یہ طریقہ صرف ایک مطابقت پذیر بلاک یا طریقہ سے بلایا جا سکتا ہے (بصورت دیگر، اسے کیا مفت ہونا چاہئے اور اس سے کیا توقع کرنی چاہئے)۔ یہ بھی نوٹ کریں کہ یہ آبجیکٹ کلاس کا ایک طریقہ ہے ۔ زیادہ واضح طور پر، ایک نہیں بلکہ تین بھی:
  • Wait() - موجودہ تھریڈ کو انتظار کے موڈ میں رکھتا ہے جب تک کہ دوسرا تھریڈ اس اعتراض کے لیے notify() یا notifyAll() طریقہ کو کال نہیں کرتا (ہم ان طریقوں کے بارے میں بعد میں بات کریں گے)۔

  • Wait (طویل ٹائم آؤٹ) - موجودہ تھریڈ کو انتظار کے موڈ میں رکھتا ہے جب تک کہ دوسرا تھریڈ اس آبجیکٹ پر notify() یا notifyAll() طریقہ کو کال نہ کرے یا مخصوص ٹائم آؤٹ ختم نہ ہو جائے ۔

  • انتظار کریں (لمبی ٹائم آؤٹ، int nanos) - پچھلے ایک کی طرح، صرف nanos آپ کو نینو سیکنڈز (زیادہ درست وقت کی ترتیب) کی وضاحت کرنے کی اجازت دیتا ہے۔

  • Notify() ایک ایسا طریقہ ہے جو آپ کو موجودہ سنکرونائزیشن بلاک کے ایک بے ترتیب دھاگے کو جگانے کی اجازت دیتا ہے۔ ایک بار پھر، اسے صرف ایک مطابقت پذیر بلاک یا طریقہ کار میں بلایا جا سکتا ہے (بالآخر، دوسری جگہوں پر اسے غیر منجمد کرنے کے لیے کوئی نہیں ہوگا)۔

  • NotifyAll() ایک ایسا طریقہ ہے جو موجودہ مانیٹر پر تمام انتظار کے دھاگوں کو بیدار کرتا ہے (صرف مطابقت پذیر بلاک یا طریقہ میں بھی استعمال ہوتا ہے)۔

110. بہاؤ کو کیسے روکا جائے؟

کہنے کی پہلی بات یہ ہے کہ جب run() طریقہ مکمل طور پر عمل میں آتا ہے تو تھریڈ خود بخود تباہ ہو جاتا ہے۔ لیکن کبھی کبھی آپ کو اس طریقہ کار کے مکمل ہونے سے پہلے، شیڈول سے پہلے اسے مارنے کی ضرورت ہوتی ہے۔ تو پھر ہمیں کیا کرنا چاہیے؟ شاید تھریڈ آبجیکٹ میں stop() طریقہ ہونا چاہئے ؟ اس سے کوئی فرق نہیں پڑتا ہے کہ یہ کیسے ہے! یہ طریقہ پرانا سمجھا جاتا ہے اور یہ سسٹم کے کریشوں کا باعث بن سکتا ہے۔ جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 12 - 6ٹھیک ہے، پھر کیا؟ ایسا کرنے کے دو طریقے ہیں: پہلا اپنا اندرونی بولین فلیگ استعمال کرنا۔ آئیے ایک مثال دیکھتے ہیں۔ ہمارے پاس ایک تھریڈ کا اپنا نفاذ ہے جس کو اسکرین پر ایک خاص جملہ دکھانا چاہئے جب تک کہ یہ مکمل طور پر بند نہ ہوجائے:
public class CustomThread extends Thread {
private boolean isActive;

   public CustomThread() {
       this.isActive = true;
   }

   @Override
   public void run() {
       {
           while (isActive) {
               System.out.println("Поток выполняет некую логику...");
           }
           System.out.println("Поток остановлен!");
       }
   }

   public void stopRunningThread() {
       isActive = false;
   }
}
stopRunning() طریقہ استعمال کرتے وقت ، اندرونی جھنڈا غلط ہو جاتا ہے اور رن کا طریقہ چلنا بند ہو جاتا ہے۔ آئیے اسے مین میں چلائیں :
System.out.println("Начало выполнения программы");
CustomThread thread = new CustomThread();
thread.start();
Thread.sleep(3);
// пока наш основной поток спит, вспомогательный  CustomThread работает и выводит в коноль своё сообщение
thread.stopRunningThread();
System.out.println("Конец выполнения программы");
نتیجے کے طور پر، ہم کنسول میں کچھ اس طرح دیکھیں گے:
پروگرام پر عمل درآمد کا آغاز تھریڈ کچھ منطق پر عمل کر رہا ہے... تھریڈ کچھ منطق پر عمل کر رہا ہے... تھریڈ کچھ منطق پر عمل کر رہا ہے... تھریڈ کچھ منطق پر عمل کر رہا ہے... تھریڈ کچھ منطق پر عمل کر رہا ہے... تھریڈ کچھ منطق پر عمل کر رہا ہے... پروگرام کی تکمیل کا اختتام تھریڈ روک دیا گیا ہے!
اس کا مطلب ہے کہ ہمارے تھریڈ نے کام کیا، کنسول میں پیغامات کی ایک خاص تعداد کو آؤٹ پٹ کیا اور کامیابی سے روک دیا گیا۔ میں نوٹ کرتا ہوں کہ میسجز آؤٹ پٹ کی تعداد رن سے رن مختلف ہوگی؛ بعض اوقات اضافی تھریڈ کچھ بھی آؤٹ پٹ نہیں کرتا تھا۔ جیسا کہ میں نے دیکھا، یہ مرکزی تھریڈ کے سونے کے وقت پر منحصر ہے، یہ جتنا لمبا ہوگا، اتنا ہی کم امکان ہے کہ اضافی دھاگہ کچھ بھی آؤٹ پٹ نہیں کرے گا۔ 1ms کے نیند کے وقت کے ساتھ، پیغامات تقریباً کبھی آؤٹ پٹ نہیں ہوتے ہیں، لیکن اگر آپ اسے 20ms پر سیٹ کرتے ہیں، تو یہ تقریباً ہمیشہ کام کرتا ہے۔ شاید، جب وقت کم ہوتا ہے، دھاگے کے پاس اپنا کام شروع کرنے اور شروع کرنے کا وقت نہیں ہوتا ہے، اور فوراً روک دیا جاتا ہے۔ دوسرا طریقہ یہ ہے کہ Thread آبجیکٹ پر interrupted() طریقہ استعمال کیا جائے ، جو اندرونی مداخلت والے جھنڈے کی قدر واپس کرتا ہے (یہ جھنڈا بطور ڈیفالٹ غلط ہے ) اور اس کا دوسرا interrupt() طریقہ ، جو اس جھنڈے کو سچ پر سیٹ کرتا ہے (جب یہ جھنڈا سچ ہے دھاگے کو اپنا کام بند کر دینا چاہیے)۔ آئیے ایک مثال دیکھتے ہیں:
public class CustomThread extends Thread {

   @Override
   public void run() {
       {
           while (!Thread.interrupted()) {
               System.out.println("Поток выполняет некую логику...");
           }
           System.out.println("Поток остановлен!");
       }
   }
}
مین میں چلائیں :
System.out.println("Начало выполнения программы");
Thread thread = new CustomThread();
thread.start();
Thread.sleep(3);
thread.interrupt();
System.out.println("Конец выполнения программы");
عمل درآمد کا نتیجہ وہی ہوگا جیسا کہ پہلی صورت میں ہے، لیکن مجھے یہ طریقہ زیادہ پسند ہے: ہم کم کوڈ لکھتے ہیں اور زیادہ تیار شدہ، معیاری فعالیت استعمال کرتے ہیں۔ جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 12 - 7یہیں پر آج ہم رکیں گے۔جاوا ڈویلپر کے انٹرویوز سے سوالات اور جوابات کا تجزیہ۔  حصہ 12 - 8
سیریز میں دیگر مواد:
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION