இந்தக் கட்டுரையில், நூலைக் கட்டுப்படுத்துவதற்கான காத்திருப்பு() முறை மற்றும் notify() / notifyAll() முறைகளைப் பார்ப்போம் . இந்த முறைகள் அடிப்படை வகுப்பில் java.lang.Object இல் வரையறுக்கப்பட்டுள்ளன , அதன்படி, ஜாவாவில் இருக்கும் பரம்பரை வழிமுறைகள் இந்த முறைகளை முற்றிலும் அனைத்து வகுப்புகளுக்கும் வழங்குகின்றன. அதாவது, உங்கள் சொந்த வகுப்பையும் அதன் பொருட்களையும் உருவாக்கும்போது, ​​இந்த முறைகளை நீங்கள் எப்போதும் அழைக்கலாம்.

காத்திருப்பு() மற்றும் அறிவிப்பு()/notifyAll() முறைகள் எவ்வாறு செயல்படுகின்றன?

  • காத்திருங்கள் () . சுருக்கமாக, இந்த முறை மானிட்டரை வெளியிடுகிறது மற்றும் மற்றொரு நூல் notify() / notifyAll() முறையை அழைக்கும் வரை அழைப்புத் தொடரை காத்திருக்கும் நிலையில் வைக்கிறது ;
  • அறிவிக்கவும்() . காத்திருப்பு() முறை முன்பு அழைக்கப்பட்ட நூலின் வேலையைத் தொடர்கிறது;
  • notifyAll() முறையானது முன்பு காத்திருப்பு () முறை என்று அழைக்கப்பட்ட அனைத்து த்ரெட்களையும் மீண்டும் தொடங்கும்.
இப்போது காத்திருப்பு () முறையைப் பற்றி விரிவாகப் பார்ப்போம் . பொருள் வகுப்பில் இந்த முறைக்கான மூன்று விருப்பங்கள் உள்ளன :
  • பொது இறுதி சொந்த வெற்றிட காத்திருப்பு (நீண்ட நேரம் மிலிஸ்) எறிகிறது குறுக்கீடு விதிவிலக்கு ; இது தற்போதைய த்ரெட்டை எழுப்பும் வரை காத்திருக்க வைக்கிறது. பொதுவாக இது அறிவிக்கப்படுவதன் மூலமோ அல்லது குறுக்கீடு செய்வதன் மூலமோ அல்லது ஒரு குறிப்பிட்ட அளவு நிகழ்நேரம் முடியும் வரை நடக்கும்.

  • பொது இறுதி வெற்றிட காத்திருப்பு() எறிகிறது InterruptedException . அளவுருக்கள் இல்லாத ஒரு முறையை நாம் இரண்டாவதாக எழுதியது தற்செயல் நிகழ்வு அல்ல. உண்மையில், நீங்கள் அதன் குறியீட்டைப் பார்த்தால், இது முறையின் முதல் மாறுபாட்டைக் குறிக்கிறது, இது 0L வாதத்தைக் கொண்டுள்ளது.

  • பொது இறுதி காத்திருப்பு (நீண்ட நேரம் முடிந்தது, இன்ட் நானோஸ்) . தற்போதைய தொடரிழை விழித்துக்கொள்ளும் வரை, பொதுவாக அறிவிக்கப்படும் அல்லது குறுக்கிடுவதன் மூலம் அல்லது ஒரு குறிப்பிட்ட அளவு நிகழ்நேரம் முடியும் வரை காத்திருக்கச் செய்கிறது.

காத்திருப்பு () முறையானது அழைப்புத் தொடரை இடைநிறுத்துவதாகும். இதற்கு என்ன அர்த்தம்? இந்த முறைகள் வகுப்பைச் சேர்ந்தவை. வகுப்பின் அடிப்படையில், நீங்கள் ஒரு பொருளை உருவாக்குகிறீர்கள். சில நூல்களில் பொருள்கள் உள்ளன. அதாவது, சில திரிகளில் பொருள்கள் உருவாக்கப்படுகின்றன. இந்த ஆப்ஜெக்ட் வேலை செய்யும் திரியில், காத்திரு() என்று அழைத்தால், இந்த திரி நின்றுவிடும் என்ற உண்மைக்கு இது வழிவகுக்கும். பொருளே ஒரு வகையான மானிட்டராக செயல்படுகிறது. அது என்ன? நீங்கள் வெவ்வேறு பொருட்களை உருவாக்க முடியும் என்பது தெளிவாகிறது, மேலும் அவை அனைத்தும் காத்திருப்பு ()முறை. எந்தப் பொருள் ஒரு குறிப்பிட்ட நூலை நிறுத்தியது என்பது பற்றிய புரிதல் உள்ளது. அளவுருவில் எழுதப்பட்டிருக்கும் வரை நூல் நின்றுவிடும். பின்னர் அது தொடங்கும். இந்த இழை தானாகவே தொடங்க முடியாது. பணியை மீண்டும் தொடங்க, அனைத்து முறைகளையும் அறிவித்து அறிவிக்கவும். அறிவிப்பு() அல்லது notifyAll() க்கான அழைப்பு வேறு ஏதேனும் தொடரை இயக்க வேண்டும். காத்திருப்பு() உடன் , நீங்கள் பல தொடரிழைகளை நிறுத்தலாம், மேலும் notifyAll() உடன் அனைத்துத் தொடரையும் தொடங்கலாம் . பல தொடரிழைகள் நிறுத்தப்பட்டு, அறிவிப்பு() என்று அழைக்கப்பட்டால், எந்த நூல் இந்த முறையை மீண்டும் தொடங்கும் என்பதைச் சரியாகச் சொல்ல முடியாது. காத்திருப்பு() முறையில் காத்திருப்பு இழைகள் இல்லை என்றால் , அறிவிக்கும் போது எதுவும் நடக்காதுnotifyAll() அழைக்கப்படுகிறது. ஒரு குறிப்பிட்ட பொருளின் மீது காத்திருப்பு() அல்லது நோட்டிஃபை() முறைகளை ஒரு த்ரெட், தற்போது அந்த பொருளில் பூட்டினால் மட்டுமே அழைக்க முடியும் . wait() , notify() , and notifyAll() ஆகியவை ஒத்திசைக்கப்பட்ட குறியீட்டிலிருந்து மட்டுமே அழைக்கப்பட வேண்டும்.

காத்திரு() முறை உதாரணம்

இந்த முறை எவ்வாறு செயல்படுகிறது என்பதை விளக்கும் மிகவும் பிரபலமான எடுத்துக்காட்டுகளில் ஒன்றை நாங்கள் பெற்றுள்ளோம். எங்களிடம் ஒரு கடை, உற்பத்தியாளர் மற்றும் நுகர்வோர் உள்ளனர் என்று வைத்துக்கொள்வோம். உற்பத்தியாளர் உற்பத்தியின் சில தயாரிப்புகளை கடைக்கு மாற்றுகிறார், அதன் பிறகு நுகர்வோர் அவற்றை எடுத்துக் கொள்ளலாம். உற்பத்தியாளர் முறையே 8 பொருட்களை உற்பத்தி செய்ய வேண்டும், நுகர்வோர் அனைத்தையும் வாங்க வேண்டும். ஆனால் அதே நேரத்தில், ஒரே நேரத்தில் 6 க்கும் மேற்பட்ட பொருட்கள் கிடங்கில் இருக்க முடியாது. இந்தச் சிக்கலைத் தீர்க்க, காத்திருப்பு() மற்றும் நோட்டிஃபை() முறைகளைப் பயன்படுத்துகிறோம் . மூன்று வகுப்புகளை வரையறுப்போம்: சந்தை , உற்பத்தியாளர் மற்றும் வாடிக்கையாளர் . ரன் () முறையில் உற்பத்தியாளர் சந்தைப் பொருளில் 8 தயாரிப்புகளைச் சேர்க்கிறார்புட்() முறை. லூப்பில் உள்ள ரன்() முறையில் உள்ள கிளையன்ட் இந்த தயாரிப்புகளைப் பெறுவதற்கு சந்தைப் பொருளின் பெறு முறையை அழைக்கிறது . சந்தை வகுப்பின் புட் மற்றும் கெட் முறைகள் ஒத்திசைக்கப்பட்டுள்ளன. சந்தை வகுப்பில் பொருட்கள் இருப்பதைக் கண்காணிக்க , உருப்படி மாறியின் மதிப்பைச் சரிபார்க்கிறோம். ஒரு பொருளைப் பெறுவதற்கான get () முறை குறைந்தது ஒரு தயாரிப்பு இருந்தால் மட்டுமே சுட வேண்டும். எனவே, கெட் முறையில், தயாரிப்பு காணவில்லையா என்பதை நாங்கள் சரிபார்க்கிறோம். உருப்படி கிடைக்கவில்லை என்றால், காத்திருப்பு () முறை அழைக்கப்படுகிறது. இந்த முறை சந்தைப் பொருளின் மானிட்டரை வெளியிடுகிறது மற்றும் அறிவிக்கும் வரை பெறு முறையைத் தடுக்கிறது ()முறை அதே மானிட்டரில் அழைக்கப்படுகிறது. put() முறையில் ஒரு பொருளைச் சேர்த்து , notify() எனப்படும் போது, ​​get() method ஆனது மானிட்டரைப் பெறுகிறது. அதன் பிறகு, எங்கள் வாடிக்கையாளர் ஒரு பொருளைப் பெறுகிறார். இதைச் செய்ய, ஒரு செய்தி காட்டப்படும், மேலும் உருப்படியின் மதிப்பு குறைக்கப்படுகிறது. இறுதியாக, notify() method call, 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() ஐப் பயன்படுத்தி, உற்பத்தியாளர் ஒரு புதிய உருப்படியைச் சேர்ப்பதற்காக நாங்கள் காத்திருக்கிறோம் . சேர்த்த பிறகு, நாங்கள் 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 உடன் செயல்முறை முடிந்தது