JavaRush /جاوا بلاگ /Random-UR /ملٹی تھریڈنگ: تھریڈ کلاس کے طریقے کیا کرتے ہیں۔

ملٹی تھریڈنگ: تھریڈ کلاس کے طریقے کیا کرتے ہیں۔

گروپ میں شائع ہوا۔
ہیلو! آج ہم ملٹی تھریڈنگ کے بارے میں بات کرتے رہتے ہیں۔ آئیے تھریڈ کلاس پر ایک نظر ڈالتے ہیں اور اس کے متعدد طریقے کیسے کام کرتے ہیں۔ پہلے، جب ہم کلاس کے طریقوں کا مطالعہ کرتے تھے، تو ہم اکثر اسے اس طرح لکھتے تھے: "طریقہ کا نام" -> "یہ کیا کرتا ہے۔"
ملٹی تھریڈنگ: تھریڈ کلاس کے طریقے کیا کرتے ہیں - 1
یہ تھریڈ طریقوں کے ساتھ کام نہیں کرے گا :) ان کی منطق زیادہ پیچیدہ ہے، اور کئی مثالوں کے بغیر اسے سمجھنا ناممکن ہے۔

Thread.start() طریقہ

آئیے تکرار کے ساتھ شروع کرتے ہیں۔ جیسا کہ آپ کو شاید یاد ہوگا، آپ اپنی کلاس کو کلاس سے وراثت میں لے کر Threadاور اس میں طریقہ کو اوور رائیڈ کر کے ایک تھریڈ بنا سکتے ہیں run()۔ لیکن، یقینا، یہ خود سے شروع نہیں ہوگا. ایسا کرنے کے لیے، ہم اپنے آبجیکٹ پر طریقہ کو کہتے ہیں start()۔ ملٹی تھریڈنگ: تھریڈ کلاس کے طریقے کیا کرتے ہیں - 2آئیے پچھلے لیکچر کی مثال یاد رکھیں:
public class MyFirstThread extends Thread {

   @Override
   public void run() {
       System.out.println("Выполнен поток " + getName());
   }
}


public class Main {

   public static void main(String[] args) {

       for (int i = 0; i < 10; i++) {
           MyFirstThread thread = new MyFirstThread();
           thread.start();
       }
   }
}
براہ کرم نوٹ کریں: تھریڈ شروع کرنے کے لیے، آپ کو خصوصی طریقہ کو کال کرنا چاہیےstart()، نہ کہrun()! یہ کرنا ایک آسان غلطی ہے، خاص طور پر جب پہلی بار ملٹی تھریڈنگ سیکھ رہے ہوں۔ run()اگر ہماری مثال میں آپ 10 بار کے بجائےآبجیکٹ کے طریقہ کو کہتے ہیںstart()، تو نتیجہ اس طرح ہوگا:
public class Main {

   public static void main(String[] args) {

       for (int i = 0; i < 10; i++) {
           MyFirstThread thread = new MyFirstThread();
           thread.run();
       }
   }
}
تھریڈ-0 دھاگہ پھانسی دی گئی تھریڈ-1 دھاگہ پھانسی دی گئی تھریڈ-2 تھریڈ پھانسی دی گئی تھریڈ-3 تھریڈ پھانسی دی گئی تھریڈ-4 تھریڈ پھانسی دی گئی تھریڈ-5 تھریڈ پھانسی دی گئی تھریڈ-6 تھریڈ تھریڈ-7 تھریڈ پھانسی دی گئی تھریڈ-8 تھریڈ 9 آؤٹ پٹ کی ترتیب کو دیکھیں: سب کچھ سختی سے ترتیب میں ہوتا ہے۔ عجیب، ٹھیک ہے؟ ہم اس کے عادی نہیں ہیں، کیونکہ ہم پہلے ہی جان چکے ہیں کہ جس ترتیب میں تھریڈز کو لانچ اور عمل میں لایا جاتا ہے اس کا تعین ہمارے آپریٹنگ سسٹم کے اندر موجود سپر انٹیلی جنس یعنی تھریڈ شیڈیولر سے ہوتا ہے۔ شاید میں صرف خوش قسمت تھا؟ یقیناً یہ قسمت کی بات نہیں ہے۔ آپ پروگرام کو ایک دو بار مزید چلا کر اس کی تصدیق کر سکتے ہیں۔ نقطہ یہ ہے کہ کسی طریقہ کو براہ راست کال کرنےrun()کا ملٹی تھریڈنگ سے کوئی تعلق نہیں ہے۔ اس صورت میں، پروگرام کو مرکزی دھاگے میں عمل میں لایا جائے گا - جس میں طریقہ کار پر عمل کیا جاتا ہےmain()۔ یہ آسانی سے کنسول میں 10 لائنیں ترتیب دے گا اور بس۔ کوئی 10 تھریڈ شروع نہیں ہوں گے۔ لہذا، مستقبل کے لئے یاد رکھیں اور مسلسل اپنے آپ کو چیک کریں. اگر آپ چاہتے ہیں کہ یہ ہو جائے توrun()اسے کال کریںstart()۔ آئیے آگے بڑھیں۔

Thread.sleep() طریقہ

موجودہ تھریڈ کے عمل کو کچھ وقت کے لیے روکنے کے لیے، استعمال کریں sleep()۔ ملٹی تھریڈنگ: تھریڈ کلاس کے طریقے کیا کرتے ہیں - 3طریقہ sleep()پیرامیٹر کے طور پر ملی سیکنڈز کی تعداد لیتا ہے، یعنی وہ وقت جس کے لیے دھاگے کو سونے کی ضرورت ہوتی ہے۔
public class Main {

   public static void main(String[] args) throws InterruptedException {

       long start = System.currentTimeMillis();

       Thread.sleep(3000);

       System.out.println(" - Сколько я проспал? \n - " + ((System.currentTimeMillis()-start)) / 1000 + " секунды");

   }
}
کنسول آؤٹ پٹ: - میں کتنی دیر تک سوتا رہا؟ - 3 سیکنڈ براہ کرم نوٹ کریں: طریقہ sleep()جامد ہے: یہ موجودہ دھاگے کو نیند میں ڈال دیتا ہے۔ یعنی وہ جو اس وقت کام کر رہا ہے۔ ایک اور اہم نکتہ: نیند کی حالت میں بہاؤ میں خلل پڑ سکتا ہے۔ اس صورت میں، پروگرام میں ایک استثناء واقع ہوگا InterruptedException۔ ہم ذیل میں ایک مثال دیکھیں گے۔ ویسے، تھریڈ کے "جاگنے" کے بعد کیا ہوتا ہے؟ کیا یہ فوری طور پر اپنی پھانسی کو وہیں سے جاری رکھے گا جہاں سے اس نے چھوڑا تھا؟ نہیں. تھریڈ کے جاگنے کے بعد — جب وقت ختم ہونے کی دلیل کے طور پر گزر جاتا ہے Thread.sleep()— یہ چلنے کے قابل حالت میں داخل ہوتا ہے ۔ تاہم، اس کا مطلب یہ نہیں ہے کہ تھریڈ شیڈیولر اسے چلائے گا۔ یہ بالکل ممکن ہے کہ یہ کسی اور "غیر سوئے ہوئے" دھاگے کو ترجیح دے گا، اور ہمارا "تازہ بیدار" تھریڈ تھوڑی دیر بعد کام کرتا رہے گا۔ یاد رکھنا یقینی بنائیں: "جاگنے کا مطلب یہ نہیں ہے کہ اسی سیکنڈ میں کام جاری رکھیں!"

Thread.join() طریقہ

Многопоточность: что делают методы класса Thread - 4یہ طریقہ join()موجودہ تھریڈ کے عمل کو اس وقت تک معطل کر دیتا ہے جب تک کہ دوسرا تھریڈ مکمل نہ ہو جائے۔ اگر ہمارے پاس 2 تھریڈز ہیں، t1اور t2، اور ہم لکھیں گے -
t1.join()
t2جب تک t1 اپنا کام مکمل نہیں کر لیتا تب تک کام شروع نہیں کرے گا۔ join()تھریڈز کے عمل کی ترتیب کو یقینی بنانے کے لیے طریقہ استعمال کیا جا سکتا ہے۔ آئیے join()ایک مثال کا استعمال کرتے ہوئے کام کو دیکھیں:
public class ThreadExample extends Thread {

   @Override
   public void run() {

       System.out.println("Начало работы потока " + getName());

       try {
           Thread.sleep(5000);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       System.out.println("Поток " + getName() +  " завершил работу.");
   }
}


public class Main {

   public static void main(String[] args) throws InterruptedException {

       ThreadExample t1 = new ThreadExample();
       ThreadExample t2 = new ThreadExample();

       t1.start();


 /*Второй поток t2 начнет выполнение только после того, How будет завершен
       (or бросит исключение) первый поток - t1*/
       try {
           t1.join();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }

       t2.start();

       //Главный поток продолжит работу только после того, How t1 и t2 завершат работу
       try {
           t1.join();
           t2.join();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }

       System.out.println("Все потоки закончor работу, программа завершена");

   }
}
ہم نے ایک سادہ کلاس بنائی ہے ThreadExample۔ اس کا کام اسکرین پر کام کے آغاز کے بارے میں پیغام دکھانا ہے، پھر 5 سیکنڈ کے لیے سو جانا اور آخر میں کام کے مکمل ہونے کی اطلاع دینا ہے۔ کچھ بھی پیچیدہ نہیں۔ بنیادی منطق کلاس میں موجود ہے Main۔ تبصرے دیکھیں: طریقہ استعمال کرتے ہوئے، join()ہم دھاگوں کے عمل کی ترتیب کو کامیابی سے کنٹرول کرتے ہیں۔ اگر آپ کو موضوع کا آغاز یاد ہے تو تھریڈ شیڈیولر نے یہ کیا۔ اس نے انہیں اپنی صوابدید پر شروع کیا: ہر بار مختلف طریقے سے۔ یہاں، طریقہ استعمال کرتے ہوئے، ہم نے اس بات کو یقینی بنایا کہ پہلے تھریڈ کو لانچ کیا جائے گا اور اس پر عمل کیا جائے گا t1، پھر تھریڈ t2، اور ان کے بعد ہی پروگرام پر عمل درآمد کا مرکزی دھاگہ۔ آگے بڑھو. حقیقی پروگراموں میں، آپ کو اکثر ایسے حالات کا سامنا کرنا پڑتا ہے جب آپ کو کسی دھاگے کے عمل میں رکاوٹ ڈالنے کی ضرورت ہوتی ہے۔ مثال کے طور پر، ہمارا تھریڈ چل رہا ہے، لیکن یہ کسی خاص واقعہ یا شرط کے پورا ہونے کا انتظار کر رہا ہے۔ اگر ایسا ہوتا ہے تو یہ رک جاتا ہے۔ یہ شاید منطقی ہوگا اگر کوئی طریقہ ہوتا جیسے stop(). تاہم، سب کچھ اتنا آسان نہیں ہے. ایک زمانے میں، Thread.stop()جاوا میں ایک طریقہ درحقیقت موجود تھا اور آپ کو دھاگے کے کام میں خلل ڈالنے کی اجازت دیتا تھا۔ لیکن بعد میں اسے جاوا لائبریری سے ہٹا دیا گیا۔ آپ اسے اوریکل دستاویزات میں دیکھ سکتے ہیں اور دیکھ سکتے ہیں کہ اسے فرسودہ کے طور پر نشان زد کیا گیا ہے ۔ کیوں؟ کیونکہ اس نے بغیر کسی اضافی کام کے بہاؤ کو روک دیا۔ مثال کے طور پر، ایک تھریڈ ڈیٹا کے ساتھ کام کر سکتا ہے اور اس میں کچھ تبدیل کر سکتا ہے۔ پھر اسے کام کے بیچ میں ہی اچانک دستک دے دیا گیا stop()- اور بس۔ کوئی درست شٹ ڈاؤن نہیں تھا، وسائل کو آزاد نہیں کیا گیا تھا، یہاں تک کہ کوئی غلطی سے نمٹنے نہیں تھا - اس میں سے کچھ بھی نہیں ہوا۔ طریقہ stop()، مبالغہ آرائی کے لیے، بس اس کے راستے میں موجود ہر چیز کو تباہ کر دیا۔ اس کے آپریشن کا موازنہ اس سے کیا جا سکتا ہے کہ کس طرح کوئی کمپیوٹر کو بند کرنے کے لیے ساکٹ سے پلگ کھینچتا ہے۔ ہاں، آپ مطلوبہ نتیجہ حاصل کر سکتے ہیں۔ لیکن ہر کوئی سمجھتا ہے کہ چند ہفتوں میں کمپیوٹر اس کے لیے "شکریہ" نہیں کہے گا۔ اس وجہ سے، جاوا میں دھاگوں کو روکنے کی منطق کو تبدیل کر دیا گیا تھا، اور اب ایک خاص طریقہ استعمال کیا جاتا ہے - interrupt()۔

Thread.interrupt() طریقہ

اگر آپ تھریڈ پر کسی طریقہ کو کال کریں تو کیا ہوگا interrupt()؟ 2 اختیارات ہیں:
  1. اگر اعتراض اس وقت انتظار کی حالت میں تھا، مثال کے طور پر، joinیا sleep، انتظار میں خلل آئے گا اور پروگرام پھینک دے گا InterruptedException۔
  2. اگر اس وقت تھریڈ کام کرنے کی حالت میں تھا، تو آبجیکٹ کا بولین جھنڈا سیٹ ہو جائے گا interrupted۔
لیکن ہمیں اس جھنڈے کی قدر کے لیے اعتراض کو چیک کرنا ہو گا اور خود ہی صحیح طریقے سے کام مکمل کرنا ہو گا! اس مقصد کے لیے، کلاس کا Threadایک خاص طریقہ ہے - boolean isInterrupted()۔ آئیے مین کورس لیکچر سے گھڑی کی مثال پر واپس جائیں۔ سہولت کے لیے، اسے قدرے آسان بنایا گیا ہے:
public class Clock extends Thread {

   public static void main(String[] args) throws InterruptedException {
       Clock clock = new Clock();
       clock.start();

       Thread.sleep(10000);
       clock.interrupt();
   }

   public void run() {
       Thread current = Thread.currentThread();

       while (!current.isInterrupted())
       {
           try {
               Thread.sleep(1000);
           } catch (InterruptedException e) {
               System.out.println("Работа потока была прервана");
               break;
           }
           System.out.println("Tik");
       }
   }
}
ہمارے معاملے میں، گھڑی شروع ہوتی ہے اور ہر سیکنڈ میں ٹک ٹک کرنے لگتی ہے۔ 10ویں سیکنڈ میں ہم گھڑی کے بہاؤ میں خلل ڈالتے ہیں۔ جیسا کہ آپ پہلے ہی جانتے ہیں، اگر ہم جس تھریڈ میں رکاوٹ ڈالنے کی کوشش کر رہے ہیں وہ انتظار کی حالتوں میں سے کسی ایک میں ہے، تو اس کا نتیجہ ہوتا ہے InterruptedException۔ اس قسم کا استثنیٰ چیک شدہ استثناء ہے، اس لیے اسے آسانی سے پکڑا جا سکتا ہے اور ہمارے پروگرام کے خاتمے کی منطق کو عمل میں لایا جا سکتا ہے۔ ہم نے یہی کیا۔ ہمارا نتیجہ یہ ہے: ٹِک ٹِک ٹِک ٹِک ٹِک ٹِک ٹِک ٹِک ٹِک ٹِک ٹِک ٹِک ٹِک تھریڈ کے کام میں خلل پڑا Thread۔ اپنے علم کو مستحکم کرنے کے لیے، آپ ملٹی تھریڈنگ کے بارے میں یہ ویڈیو لیکچر دیکھ سکتے ہیں:
یہ بہترین اضافی مواد کے طور پر کام کرے گا! آخر میں، طریقوں کا جائزہ لینے کے بعد، یہ بالکل بتاتا ہے کہ ہم کورس میں مزید کس چیز سے گزریں گے :) گڈ لک!
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION