CodeGym/Java Blog/এলোমেলো/জাভাতে অপেক্ষা করুন() পদ্ধতি
John Squirrels
লেভেল 41
San Francisco

জাভাতে অপেক্ষা করুন() পদ্ধতি

এলোমেলো দলে প্রকাশিত
সদস্যগণ
এই নিবন্ধে, আমরা থ্রেড নিয়ন্ত্রণ করার জন্য wait() পদ্ধতি এবং notify() / notifyAll() পদ্ধতিগুলি দেখব । এই পদ্ধতিগুলিকে বেস ক্লাস java.lang.Object- এ সংজ্ঞায়িত করা হয়েছে এবং সেই অনুযায়ী, জাভাতে থাকা ইনহেরিটেন্স মেকানিজমগুলি একেবারে সমস্ত ক্লাসে এই পদ্ধতিগুলি প্রদান করে৷ অর্থাৎ, যখন আপনি আপনার নিজস্ব ক্লাস এবং এর অবজেক্ট তৈরি করেন, আপনি সর্বদা এই পদ্ধতিগুলিকে কল করতে পারেন।

কিভাবে wait() এবং notify()/notifyAll() পদ্ধতি কাজ করে?

  • অপেক্ষা করুন() । সংক্ষেপে, এই পদ্ধতিটি মনিটরটিকে প্রকাশ করে এবং কলিং থ্রেডটিকে অপেক্ষার অবস্থায় রাখে যতক্ষণ না অন্য থ্রেড notify() / notifyAll() পদ্ধতিতে কল করে;
  • বিজ্ঞপ্তি() । একটি থ্রেডের কাজ চালিয়ে যায় যার অপেক্ষা() পদ্ধতিটি আগে বলা হয়েছিল;
  • notifyAll() মেথড সেই সমস্ত থ্রেড পুনরায় শুরু করে যেগুলিকে আগে তাদের wait() মেথড বলা হয়েছিল।
এখন অপেক্ষা () পদ্ধতিটি ঘনিষ্ঠভাবে দেখে নেওয়া যাক । অবজেক্ট ক্লাসে এই পদ্ধতির জন্য তিনটি বিকল্প রয়েছে :
  • সর্বজনীন চূড়ান্ত নেটিভ ভ্যায়েড অপেক্ষা (দীর্ঘ সময়সীমা মিলিস) বাধাপ্রাপ্ত ব্যতিক্রম নিক্ষেপ করে ; এটি বর্তমান থ্রেডটিকে জাগ্রত না হওয়া পর্যন্ত অপেক্ষা করতে দেয়। সাধারণত এটি অবহিত হওয়ার বা বাধা দেওয়ার মাধ্যমে বা নির্দিষ্ট পরিমাণ বাস্তব সময় অতিবাহিত না হওয়া পর্যন্ত ঘটে।

  • সর্বজনীন চূড়ান্ত অকার্যকর অপেক্ষা() InterruptedException নিক্ষেপ করে । এটা কোন কাকতালীয় ঘটনা নয় যে আমরা দ্বিতীয়টি হিসাবে প্যারামিটার ছাড়াই একটি পদ্ধতি লিখেছি। প্রকৃতপক্ষে, আপনি যদি এর কোডটি দেখেন তবে এটি পদ্ধতির প্রথম বৈকল্পিককে বোঝায়, এটিতে কেবল 0L যুক্তি রয়েছে।

  • সর্বজনীন চূড়ান্ত অপেক্ষা (দীর্ঘ সময়সীমা, int ন্যানো) । এটি জাগ্রত না হওয়া পর্যন্ত বর্তমান থ্রেডটিকে অপেক্ষা করতে দেয়, সাধারণত অবহিত করা বা বাধা দেওয়া বা একটি নির্দিষ্ট পরিমাণ বাস্তব সময় অতিবাহিত না হওয়া পর্যন্ত।

অপেক্ষা () পদ্ধতিটি কলিং থ্রেড স্থগিত করার উদ্দেশ্যে। এর মানে কী? এই পদ্ধতিগুলি ক্লাসের অন্তর্গত। ক্লাসের উপর ভিত্তি করে, আপনি একটি বস্তু তৈরি করেন। কিছু থ্রেডে বস্তু বিদ্যমান। অর্থাৎ কিছু থ্রেডে বস্তু তৈরি হয়। এই বস্তুটি যে থ্রেডে কাজ করে, আপনি যদি এটিতে wait() কল করেন, তাহলে এই থ্রেডটি বন্ধ হয়ে যাবে। বস্তু নিজেই এক ধরনের মনিটর হিসাবে কাজ করে। এটা কি? এটা স্পষ্ট যে আপনি বিভিন্ন অবজেক্ট তৈরি করতে পারেন এবং সেগুলির মধ্যে অপেক্ষা () থাকবেপদ্ধতি কোন বস্তুর কারণে একটি নির্দিষ্ট থ্রেড বন্ধ হয়েছে তা বোঝা যায়। থ্রেড থেমে যায় এবং যতক্ষণ পর্যন্ত এটি প্যারামিটারে লেখা থাকে ততক্ষণ অপেক্ষা করবে। এবং তারপর এটি শুরু হবে. এই থ্রেড নিজেই শুরু করতে পারে না. কাজ পুনরায় শুরু করার জন্য, বিজ্ঞপ্তি এবং সমস্ত পদ্ধতি রয়েছে। notify() বা notifyAll() করার জন্য একটি কল অন্য কোনো থ্রেড খেলতে হবে। wait() দিয়ে , আপনি একাধিক থ্রেড বন্ধ করতে পারেন, এবং notifyAll() দিয়ে সমস্ত থ্রেড শুরু করতে পারেন । যদি একাধিক থ্রেড বন্ধ করা হয় এবং notify() কল করা হয়, তাহলে ঠিক কোন থ্রেডটি এই পদ্ধতিটি পুনরায় চালু করবে তা বলা অসম্ভব। যদি wait() পদ্ধতিতে কোনো ওয়েটিং থ্রেড না থাকে , তাহলে notify() বা যখন কিছুই হবে নাnotifyAll() বলা হয়। একটি থ্রেড একটি নির্দিষ্ট বস্তুর উপর অপেক্ষা() বা নোটিফাই() পদ্ধতিতে কল করতে পারে শুধুমাত্র যদি সেই বস্তুটিতে বর্তমানে একটি লক থাকে। wait() , notify() , এবং notifyAll() শুধুমাত্র সিঙ্ক্রোনাইজড কোড থেকে কল করা উচিত।

অপেক্ষা করুন() পদ্ধতির উদাহরণ

এখানে আমরা সবচেয়ে জনপ্রিয় উদাহরণগুলির একটি পেয়েছি যা ব্যাখ্যা করে যে পদ্ধতিটি কীভাবে কাজ করে। ধরা যাক আমাদের একটি দোকান, একটি প্রযোজক এবং একটি ভোক্তা আছে। প্রস্তুতকারক উত্পাদনের কিছু পণ্য দোকানে স্থানান্তর করে, যার পরে ভোক্তা সেগুলি নিতে পারে। প্রস্তুতকারককে যথাক্রমে 8টি পণ্য উত্পাদন করতে হবে, ভোক্তাকে অবশ্যই সেগুলি কিনতে হবে। তবে একই সময়ে, গুদামে একই সময়ে 6টির বেশি আইটেম থাকতে পারে না। এই সমস্যা সমাধানের জন্য, আমরা wait() এবং notify() পদ্ধতি ব্যবহার করি। আসুন তিনটি শ্রেণী সংজ্ঞায়িত করি: বাজার , প্রস্তুতকারক এবং ক্লায়েন্ট । রান () পদ্ধতিতে প্রস্তুতকারক তার ব্যবহার করে মার্কেট অবজেক্টে 8টি পণ্য যোগ করেput() পদ্ধতি। একটি লুপে run() পদ্ধতিতে থাকা ক্লায়েন্ট এই পণ্যগুলি পেতে Market অবজেক্টের get মেথডকে কল করে । মার্কেট ক্লাসের পুট এবং গেট পদ্ধতিগুলি সিঙ্ক্রোনাইজ করা হয়। মার্কেট ক্লাসে পণ্যের উপস্থিতি ট্র্যাক করতে , আমরা আইটেম ভেরিয়েবলের মান পরীক্ষা করি। একটি পণ্য পাওয়ার জন্য get () পদ্ধতিটি কেবলমাত্র তখনই চালু হওয়া উচিত যদি কমপক্ষে একটি পণ্য থাকে। অতএব, প্রাপ্ত পদ্ধতিতে, আমরা পণ্যটি অনুপস্থিত কিনা তা পরীক্ষা করি। আইটেম উপলব্ধ না হলে, অপেক্ষা() পদ্ধতি বলা হয়। এই পদ্ধতিটি মার্কেট অবজেক্টের মনিটর রিলিজ করে এবং notify() না হওয়া পর্যন্ত get মেথড ব্লক করে।পদ্ধতি একই মনিটরে বলা হয়। যখন put() পদ্ধতিতে একটি আইটেম যোগ করা হয় এবং notify() কল করা হয়, get() পদ্ধতি মনিটর পায়। এর পরে, আমাদের ক্লায়েন্ট একটি আইটেম পায়। এটি করার জন্য, একটি বার্তা প্রদর্শিত হয় এবং আইটেমের মান হ্রাস করা হয়। অবশেষে, notify() মেথড কলটি পুট() মেথডকে চালিয়ে যাওয়ার জন্য সংকেত দেয়। 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() কে কল করি , যেন বলতে পারি যে একটি স্থান ওয়্যারহাউসে বিনামূল্যে হয়ে গেছে , এবং আপনি আরও যোগ করতে পারেন। put() পদ্ধতিতে , wait() ব্যবহার করে, আমরা ওয়্যারহাউসে স্থান প্রকাশের জন্য অপেক্ষা করছি । স্থান খালি হওয়ার পরে, আমরা আইটেমটি যোগ করি, notify() থ্রেড শুরু করে এবং ক্লায়েন্ট আইটেমটি নিতে পারে। এখানে আমাদের প্রোগ্রামের আউটপুট:
প্রস্তুতকারক আরও 1টি আইটেম যুক্ত করেছে... এখন গুদামটিতে 1টি আইটেম রয়েছে প্রস্তুতকারক আরও 1টি আইটেম যুক্ত করেছেন... এখন গুদামটিতে 2টি আইটেম রয়েছে প্রস্তুতকারক আরও 1টি আইটেম যুক্ত করেছেন... এখন গুদাম প্রস্তুতকারকের মধ্যে 3টি আইটেম রয়েছে আরও 1টি আইটেম যোগ করা হয়েছে... এখন গুদাম প্রস্তুতকারকের 4টি আইটেম রয়েছে 1টি আইটেম... বাজারের গুদামে আইটেমের পরিমাণ... 5 একজন ক্লায়েন্ট 1টি আইটেম কিনেছে... বাজারের গুদামে আইটেমের পরিমাণ... 4 একজন ক্লায়েন্ট 1টি আইটেম কিনেছে... বাজারের গুদামে আইটেমের পরিমাণ... 3 একজন ক্লায়েন্ট 1টি আইটেম কিনেছে... বাজারের গুদামে আইটেমের পরিমাণ... 2 একজন ক্লায়েন্ট 1টি আইটেম কিনেছে... বাজারের গুদামে আইটেমের পরিমাণ... 1 একজন ক্লায়েন্ট 1টি আইটেম কিনেছে... বাজারের গুদামে আইটেমের পরিমাণ ...0 প্রস্তুতকারক আরও 1টি আইটেম যোগ করেছেন... এখন গুদামটিতে 1টি আইটেম রয়েছে প্রস্তুতকারক আরও 1টি আইটেম যোগ করেছেন... এখন গুদামে 2টি আইটেম রয়েছে একজন ক্লায়েন্ট 1টি আইটেম কিনেছেন... বাজারের গুদামে আইটেমের পরিমাণ... 1 একজন ক্লায়েন্ট 1টি আইটেম কিনেছে... বাজারের গুদামে আইটেমের পরিমাণ... 0 প্রস্থান কোড 0 দিয়ে প্রক্রিয়া শেষ হয়েছে
মন্তব্য
  • জনপ্রিয়
  • নতুন
  • পুরানো
মন্তব্য লেখার জন্য তোমাকে অবশ্যই সাইন ইন করতে হবে
এই পাতায় এখনও কোনো মন্তব্য নেই