CodeGym /جاوا بلاگ /Random-SD /Wait() جاوا ۾ طريقو
John Squirrels
سطح
San Francisco

Wait() جاوا ۾ طريقو

گروپ ۾ شايع ٿيل
هن آرٽيڪل ۾، اسان ڏسنداسين انتظار () ٿريڊ کي ڪنٽرول ڪرڻ جو طريقو، ۽ Notify() / notifyAll() طريقن. اهي طريقا بنيادي ڪلاس ۾ بيان ڪيا ويا آهن java.lang.Object ۽، ان جي مطابق، وراثت ميڪانيزم جيڪي جاوا ۾ آهن اهي طريقا بلڪل سڀني طبقن کي مهيا ڪن ٿا. اهو آهي، جڏهن توهان پنهنجو طبقو ۽ ان جي شين کي ٺاهيو ٿا، توهان هميشه انهن طريقن کي سڏي سگهو ٿا.

انتظار() ۽ اطلاع()/notifyAll() طريقا ڪيئن ڪم ڪندا؟

  • انتظار ڪريو() . مختصر ۾، هي طريقو مانيٽر کي جاري ڪري ٿو ۽ ڪالنگ ٿريڊ کي انتظار جي حالت ۾ رکي ٿو جيستائين ٻيو ٿريڊ notify() / notifyAll() طريقو ڪال ڪري؛
  • اطلاع () . ھڪڙي سلسلي جو ڪم جاري آھي جنھن جو انتظار () طريقو اڳي سڏيو ويو ھو؛
  • notifyAll() طريقو انهن سڀني موضوعن کي ٻيهر شروع ڪري ٿو جيڪي اڳ ۾ ئي انهن جو انتظار () طريقو سڏيو ويندو آهي.
ھاڻي اچو ته ويجھي نظر رکون انتظار () طريقي تي. اعتراض ڪلاس ۾ هن طريقي لاءِ ٽي آپشن شامل آهن:
  • عوامي حتمي اصلي باطل انتظار (ڊگهي وقت ختم مليس) اڇلائي ٿو InterruptedException ؛ اهو موجوده سلسلي کي انتظار ڪرڻ جو سبب بڻائيندو جيستائين اهو بيدار ٿئي. عام طور تي اهو ٿئي ٿو اطلاع يا مداخلت جي ذريعي، يا جيستائين حقيقي وقت جو هڪ خاص مقدار گذري ويو آهي.

  • عوامي حتمي باطل انتظار () اڇلائي ٿو InterruptedException . اهو ڪو اتفاق نه آهي ته اسان هڪ طريقو لکيو آهي بغير پيٽرولر جي ٻئي هڪ. حقيقت ۾، جيڪڏهن توهان ان جو ڪوڊ ڏسو، اهو طريقو جي پهرين قسم ڏانهن اشارو ڪري ٿو، اهو صرف 0L دليل آهي.

  • عوامي آخري انتظار (ڊگهي وقت ختم، int nanos) . موجوده سلسلي کي انتظار ڪرڻ جو سبب بنائي ٿو جيستائين ان کي بيدار ڪيو وڃي، عام طور تي اطلاع يا مداخلت جي ذريعي، يا جيستائين حقيقي وقت جو هڪ خاص مقدار گذري چڪو آهي.

انتظار () طريقو ڪالنگ ٿريڊ کي معطل ڪرڻ جو مقصد آهي. هن جو ڇا مطلب آهي؟ اهي طريقا طبقي سان تعلق رکن ٿا. ڪلاس جي بنياد تي، توھان ھڪڙو اعتراض ٺاھيو. شيون ڪجھ موضوعن ۾ موجود آھن. اهو آهي، شيون ڪجهه موضوعن ۾ ٺهيل آهن. جنهن ٿريڊ ۾ هي اعتراض ڪم ڪري ٿو، جيڪڏهن توهان ان ۾ wait() کي ڪال ڪندا ، ته اها حقيقت سامهون ايندي ته هي ٿريڊ بند ٿي ويندو. اعتراض پاڻ هڪ قسم جي مانيٽر طور ڪم ڪري ٿو. اهو ڇا آهي؟ اهو واضح آهي ته توهان مختلف شيون ٺاهي سگهو ٿا ۽ انهن سڀني تي مشتمل هوندو wait() طريقو. اتي هڪ سمجھ آهي ته ڪهڙي شئي ڪنهن خاص موضوع جي بند ٿيڻ جو سبب بڻيل آهي. موضوع بند ٿي ويندو آهي ۽ انتظار ڪندو جيستائين اهو پيٽرولر ۾ لکيل آهي. ۽ پوء اهو شروع ٿيندو. هي سلسلو پاڻ شروع نٿو ڪري سگهي. ڪم کي ٻيهر شروع ڪرڻ لاء، اتي موجود آهن مطلع ۽ مطلع سڀ طريقا. هڪ ڪال to notify() or notifyAll() ڪنهن ٻئي سلسلي کي هلائڻ گهرجي. wait() سان ، توهان ڪيترن ئي موضوعن کي روڪي سگهو ٿا، ۽ سڀني سلسلي کي شروع ڪري سگھو ٿا notifyAll() سان . جيڪڏهن گھڻا ٿريڊ روڪيا ويا ۽ اطلاع () کي سڏيو ويو ته، اهو ٻڌائڻ ناممڪن آهي ته ڪهڙو ٿريڊ اهو طريقو ٻيهر شروع ڪندو. جيڪڏهن انتظار () طريقي تي ڪو به انتظار وارو سلسلو نه آهي ، پوء ڪجھ به نه ٿيندو جڏهن اطلاع () يا notifyAll() سڏيو ويندو آهي. هڪ ٿريڊ ڪال ڪري سگهي ٿو wait() or notify() طريقن کي ڪنهن خاص شئي تي صرف ان صورت ۾ جيڪڏهن هن وقت ان شئي تي تالا لڳل هجي. wait() , notify() , and notifyAll() صرف هم وقت ٿيل ڪوڊ مان سڏڻ گھرجي.

Wait() طريقو مثال

هتي اسان وٽ هڪ مشهور ترين مثال آهي جيڪو بيان ڪري ٿو ته طريقو ڪيئن ڪم ڪري ٿو. اچو ته اسان وٽ هڪ اسٽور، هڪ پيدا ڪندڙ، ۽ هڪ صارف آهي. ڪارخانو پيداوار جي ڪجهه شين کي اسٽور ڏانهن منتقل ڪري ٿو، جنهن کان پوء صارف انهن کي وٺي سگهي ٿو. اچو ته ٺاهيندڙ کي 8 شيون پيدا ڪرڻ گهرجن، ترتيب سان، صارف کي اهي سڀئي خريد ڪرڻ گهرجن. پر ساڳئي وقت، گودام ۾ 6 کان وڌيڪ شيون نه ٿي سگھن ٿيون. هن مسئلي کي حل ڪرڻ لاء، اسان استعمال ڪندا آهيون انتظار () ۽ اطلاع () طريقا. اچو ته ٽن طبقن جي وضاحت ڪريون: مارڪيٽ ، ٺاهيندڙ ۽ ڪلائنٽ . ٺاهيندڙ رن () طريقي ۾ 8 پراڊڪٽ شامل ڪري ٿو مارڪيٽ اعتراض ۾ ان جي put() طريقي سان استعمال ڪندي. ڪلائنٽ رن () لوپ ۾ طريقي سان انهن شين کي حاصل ڪرڻ لاءِ مارڪيٽ اعتراض جي حاصل طريقي کي سڏي ٿو. مارڪيٽ ڪلاس جا رکيل ۽ حاصل ڪرڻ جا طريقا هم وقت ساز ٿين ٿا. مارڪيٽ ڪلاس ۾ سامان جي موجودگي کي ٽريڪ ڪرڻ لاء ، اسين چيڪ ڪريون ٿا شين جي قيمت جي متغير. حاصل () پراڊڪٽ حاصل ڪرڻ جو طريقو صرف ان صورت ۾ فائر ڪرڻ گهرجي جيڪڏهن گهٽ ۾ گهٽ هڪ پيداوار هجي. تنهن ڪري، حاصل ڪرڻ واري طريقي ۾، اسان چيڪ ڪريون ٿا ته پيداوار غائب آهي. جيڪڏهن شيون موجود نه آهي، انتظار () طريقو سڏيو ويندو آهي. اهو طريقو مارڪيٽ اعتراض جي مانيٽر کي جاري ڪري ٿو ۽ حاصل ڪرڻ واري طريقي کي بلاڪ ڪري ٿو جيستائين نوٽيفڪيشن () طريقو ساڳئي مانيٽر تي سڏيو وڃي ٿو. جڏهن هڪ شيءِ put() طريقي ۾ شامل ڪئي ويندي آهي ۽ notify() سڏيو ويندو آهي، get() طريقو مانيٽر حاصل ڪندو آهي. ان کان پوء، اسان جي ڪلائنٽ هڪ شيء وصول ڪري ٿي. هن کي ڪرڻ لاء، هڪ پيغام ڏيکاريل آهي، ۽ شيء جي قيمت گهٽجي وئي آهي. آخرڪار، نوٽيفڪيشن () طريقو ڪال سگنل جاري رکڻ لاء 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();
   }
}
هتي، استعمال ڪندي wait() get() طريقي ۾ ، اسان انتظار ڪري رهيا آهيون ٺاهيندڙ کي نئين شيءِ شامل ڪرڻ لاءِ. ۽ شامل ڪرڻ کان پوء، اسان کي سڏين ٿا notify() ، ڄڻ ته اهو چوڻ آهي ته هڪ جڳهه گودام تي مفت ٿي وئي آهي ، ۽ توهان وڌيڪ شامل ڪري سگهو ٿا. put() طريقي ۾ ، wait() استعمال ڪندي، اسان گودام تي خلا جي ڇڏڻ جي انتظار ۾ آهيون . جاءِ خالي ٿيڻ کان پوءِ، اسان شيءِ شامل ڪريون ٿا، 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