CodeGym /جاوا بلاگ /Random-UR /جاوا میں انتظار () طریقہ
John Squirrels
سطح
San Francisco

جاوا میں انتظار () طریقہ

گروپ میں شائع ہوا۔
اس آرٹیکل میں، ہم تھریڈ کو کنٹرول کرنے کے لیے wait() طریقہ اور notify() / notifyAll() طریقوں کو دیکھیں گے ۔ ان طریقوں کو بیس کلاس java.lang.Object میں بیان کیا گیا ہے اور اس کے مطابق، وراثت کے طریقہ کار جو جاوا میں ہیں، بالکل تمام کلاسوں کو یہ طریقے فراہم کرتے ہیں۔ یعنی، جب آپ اپنی کلاس اور اس کی اشیاء بناتے ہیں، تو آپ ان طریقوں کو ہمیشہ کال کر سکتے ہیں۔

wait() اور notify()/notifyAll() طریقے کیسے کام کرتے ہیں؟

  • انتظار کریں() ۔ مختصراً، یہ طریقہ مانیٹر کو جاری کرتا ہے اور کالنگ تھریڈ کو انتظار کی حالت میں رکھتا ہے جب تک کہ کوئی دوسرا تھریڈ notify() / notifyAll() طریقہ کو کال نہ کرے۔
  • مطلع() . ایک تھریڈ کا کام جاری رکھتا ہے جس کا انتظار() طریقہ پہلے کہا جاتا تھا۔
  • notifyAll() طریقہ ان تمام دھاگوں کو دوبارہ شروع کرتا ہے جن کا پہلے انتظار() طریقہ کال کیا گیا تھا۔
اب انتظار () کے طریقہ کار کو قریب سے دیکھتے ہیں ۔ آبجیکٹ کلاس میں اس طریقہ کار کے تین اختیارات ہیں:
  • عوامی حتمی مقامی باطل انتظار (طویل ٹائم آؤٹ ملیس) نے InterruptedException پھینک دیا ۔ یہ موجودہ تھریڈ کے بیدار ہونے تک انتظار کرنے کا سبب بنتا ہے۔ عام طور پر یہ مطلع ہونے یا مداخلت کرنے سے ہوتا ہے، یا جب تک کہ حقیقی وقت کی ایک خاص مقدار گزر نہ جائے۔

  • عوامی حتمی باطل انتظار() InterruptedException پھینک دیتا ہے ۔ یہ کوئی اتفاق نہیں ہے کہ ہم نے پیرامیٹرز کے بغیر دوسرا طریقہ لکھا ہے۔ درحقیقت، اگر آپ اس کے کوڈ پر نظر ڈالیں، تو اس سے مراد طریقہ کی پہلی قسم ہے، اس میں صرف 0L دلیل ہے۔

  • عوامی حتمی انتظار (لمبی مدت، int nanos) ۔ موجودہ تھریڈ کو بیدار ہونے تک انتظار کرنے کا سبب بنتا ہے، عام طور پر مطلع یا مداخلت کرکے، یا جب تک کہ حقیقی وقت کی ایک خاص مقدار گزر نہ جائے۔

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

Wait() طریقہ مثال

یہاں ہمارے پاس سب سے مشہور مثالوں میں سے ایک ہے جو یہ بتاتی ہے کہ طریقہ کیسے کام کرتا ہے۔ ہم کہتے ہیں کہ ہمارے پاس ایک اسٹور، ایک پروڈیوسر، اور ایک صارف ہے۔ کارخانہ دار پیداوار کی کچھ مصنوعات کو اسٹور میں منتقل کرتا ہے، جس کے بعد صارف انہیں لے سکتا ہے۔ مینوفیکچرر کو بالترتیب 8 سامان تیار کرنے دیں، صارفین کو ان سب کو خریدنا چاہیے۔ لیکن ایک ہی وقت میں گودام میں ایک ہی وقت میں 6 سے زیادہ اشیاء نہیں رکھ سکتے۔ اس مسئلے کو حل کرنے کے لیے، ہم wait() اور notify() طریقے استعمال کرتے ہیں۔ آئیے تین طبقات کی وضاحت کرتے ہیں: مارکیٹ ، مینوفیکچرر اور کلائنٹ ۔ رن() طریقہ کار میں مینوفیکچرر اپنے put() طریقہ استعمال کرتے ہوئے مارکیٹ آبجیکٹ میں 8 مصنوعات شامل کرتا ہے ۔ لوپ میں رن() طریقہ میں کلائنٹ ان مصنوعات کو حاصل کرنے کے لیے مارکیٹ آبجیکٹ کے گیٹ میتھڈ کو کال کرتا ہے۔ مارکیٹ کلاس کے پٹ اور حاصل کرنے کے طریقے ہم آہنگ ہوتے ہیں۔ مارکیٹ کلاس میں سامان کی موجودگی کو ٹریک کرنے کے لیے ، ہم آئٹم متغیر کی قدر کو چیک کرتے ہیں۔ پروڈکٹ حاصل کرنے کے لیے get() طریقہ صرف اس صورت میں فائر ہونا چاہیے جب کم از کم ایک پروڈکٹ ہو ۔ لہذا، حاصل کرنے کے طریقہ کار میں، ہم چیک کرتے ہیں کہ آیا پروڈکٹ غائب ہے۔ اگر آئٹم دستیاب نہیں ہے تو انتظار() طریقہ کہا جاتا ہے۔ یہ طریقہ مارکیٹ آبجیکٹ کے مانیٹر کو جاری کرتا ہے اور گیٹ میتھڈ کو بلاک کرتا ہے جب تک کہ نوٹیفائی() طریقہ اسی مانیٹر پر کال نہ کیا جائے۔ جب کسی آئٹم کو put() طریقہ میں شامل کیا جاتا ہے اور notify() کہا جاتا ہے تو get() طریقہ مانیٹر حاصل کرتا ہے۔ اس کے بعد، ہمارے کلائنٹ کو ایک شے موصول ہوتی ہے۔ ایسا کرنے کے لیے، ایک پیغام ظاہر ہوتا ہے، اور شے کی قدر میں کمی واقع ہوتی ہے۔ آخر میں، notify() میتھڈ کال جاری رکھنے کے لیے put() طریقہ کا اشارہ دیتی ہے۔ put() طریقہ کار میں ، اسی طرح کی منطق کام کرتی ہے، اب صرف put() طریقہ کام کرے گا اگر مارکیٹ میں 6 سے زیادہ مصنوعات نہ ہوں ۔
class Market {

   private int item = 0;

   public synchronized void get() {
       //here we use wait() method
       while (item < 1) {
           try {
               wait();
           }
           catch (InterruptedException e) {
           }
       }
       item--;
       System.out.println("A client has bought 1 item...");
       System.out.println("Items quantity in Market warehouse... " + item);
       notify();
   }

   public synchronized void put() {
       //here we use wait() method when the Warehouse is full
       while (item >= 6) {
           try {
               wait();
           }
           catch (InterruptedException e) {
           }
       }
       item ++;
       System.out.println("Manufacturer has added 1 more item...");
       System.out.println("Now there are " + item + " items in Warehouse" );
       notify();
   }
}

class Manufacturer implements Runnable {

   Market market;

   Manufacturer(Market market) {
       this.market = market;
   }


   public void run() {
       for (int i = 0; i < 8; i++) {
           market.put();
       }
   }
}

class Client implements Runnable {

   Market market;
   Client(Market market) {
       this.market = market;
   }
   public void run() {
       for (int i = 0; i < 8; i++) {
           market.get();
       }
   }
}
//wait() method test class
public class WaitTest {
   public static void main(String[] args) {

       Market market = new Market();
       Manufacturer manufacturer = new Manufacturer(market);
       Client client = new Client(market);
       new Thread(manufacturer).start();
       new Thread(client).start();
   }
}
یہاں، get() طریقہ میں wait() کا استعمال کرتے ہوئے ، ہم مینوفیکچرر کی جانب سے ایک نئی چیز شامل کرنے کا انتظار کر رہے ہیں۔ اور شامل کرنے کے بعد، ہم نوٹیفائی() کو کال کرتے ہیں ، گویا یہ کہنا کہ گودام پر ایک جگہ مفت ہو گئی ہے ، اور آپ مزید اضافہ کر سکتے ہیں۔ put() طریقہ میں ، wait() کا استعمال کرتے ہوئے، ہم Warehouse پر جگہ کے اجراء کا انتظار کر رہے ہیں ۔ جگہ خالی ہونے کے بعد، ہم آئٹم کو شامل کرتے ہیں، notify() تھریڈ شروع ہوتا ہے اور کلائنٹ اس چیز کو اٹھا سکتا ہے۔ ہمارے پروگرام کا آؤٹ پٹ یہ ہے:
مینوفیکچرر نے 1 اور آئٹم شامل کیا ہے... اب گودام میں 1 آئٹم ہیں مینوفیکچرر نے 1 اور آئٹم شامل کیا ہے... اب گودام میں 2 آئٹمز ہیں مینوفیکچرر نے 1 اور آئٹم شامل کیا ہے... اب گودام مینوفیکچرر میں 3 آئٹمز ہیں 1 مزید آئٹم شامل کیا گیا... اب گودام میں 4 آئٹمز ہیں مینوفیکچرر نے 1 اور آئٹم شامل کیا ہے... اب گودام میں 5 آئٹمز ہیں مینوفیکچرر نے 1 مزید آئٹم شامل کیا ہے... اب گودام میں 6 آئٹمز ہیں ایک کلائنٹ نے خریدا ہے 1 آئٹم... مارکیٹ کے گودام میں اشیاء کی مقدار... 5 ایک کلائنٹ نے 1 آئٹم خریدا ہے... مارکیٹ کے گودام میں اشیاء کی مقدار... 4 ایک کلائنٹ نے 1 آئٹم خریدا ہے... مارکیٹ کے گودام میں اشیاء کی مقدار... 3 ایک کلائنٹ نے 1 آئٹم خریدا ہے... مارکیٹ کے گودام میں اشیاء کی مقدار... 2 ایک کلائنٹ نے 1 آئٹم خریدا ہے... مارکیٹ کے گودام میں اشیاء کی مقدار... 1 ایک کلائنٹ نے 1 آئٹم خریدا ہے... مارکیٹ کے گودام میں اشیاء کی مقدار ... 0 مینوفیکچرر نے 1 اور آئٹم شامل کیا ہے... اب گودام میں 1 آئٹم ہیں مینوفیکچرر نے 1 اور آئٹم شامل کیا ہے... اب گودام میں 2 آئٹمز ہیں ایک کلائنٹ نے 1 آئٹم خریدا ہے... مارکیٹ کے گودام میں اشیاء کی مقدار ... 1 ایک کلائنٹ نے 1 آئٹم خریدا ہے... مارکیٹ کے گودام میں اشیاء کی مقدار... 0 ایگزٹ کوڈ کے ساتھ عمل مکمل ہو گیا 0
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION