Java

Suspend and resuming in Thread

**Suspend বলতে বুঝায়, নির্দিষ্ট কোন থ্রেডের কাজকে বন্ধ বা অপেক্ষায় রাখা যতক্ষণ না তাকে আবার কাজ করার অনুমতি দেওয়া হয়।
** wait() মূলত এখন সাসপেন্ডের জন্যে ব্যবহৃত হয়।থ্রেডকে নির্দিষ্ট সময়ের জন্যে অপেক্ষায় রাখার জন্যে।
** notify() সকল wait() করা থ্রেডকে পুনরায় resume করা হয়।
**Stop বলতে থ্রেডের কাজকে একেবারে stop করা। যাকে আর শুরু করা যায় না।

** আমরা বই এবং ইন্টারনেটে থ্রেডের জন্যে সরাসরি suspend(), stop(), wait(), resume(), notify() পেয়ে থাকি, যার সরাসরি ব্যাবহার আগে হত। কিন্তু তার মাঝে সাসপেন্ড এবং স্টোপ মেথোড মডার্ণ জাভাতে পরিহার করা হয়েছে।
কেননা, যদি কোন একটা থ্রেড কোন একটি কাজ সম্পাদন করার আগেই যদি তাকে সাসপেন্ড করা হয় তাহলে সেই কাজটি অপূর্ণ থেকে যায় এবং অন্য থ্রেড গুলো সেই কাজ টির পরের কাজ গুলো করতে ব্যর্থ হতে পারে।
**অপরদিকে একইভাবে থ্রেড কে সরাসরি stop() মেথোড দিয়ে স্টোপ করা হলে তাহলে সিস্টেম ক্রেশ করতে পারে।

  1. সবদিক বিবেচনা করে মডার্ণ জাভাতে এগুলোকে একটু অন্যভাবে ব্যাবহার করা হয়ে থাকে, যেখানে flag কে ইউজার ডিফাইন করা মেথোডের সাহায্যের জন্যে ব্যাবহার করা হয় এবং wait() and notify() মেথোড এর সাহায্য নেওয়া হয়।
    যেমনঃ
    Public void suspendmethod() {
    Flag = false/true;
    }
    And
  2. Public void resumemethod() {
    Flag = false/true;
    notify();
    }
    এবং থ্রেডকে wait করানোর জন্যে run() method এ wait() method ব্যাবহার করা হয়।

একটি সিম্পল উদাহরণঃ

  1. public class Suspend_Stop {
    public static void main(String[] args) throws Exception {
    // মেইন ফাংশনের সাথে এইভাবে এক্সচেপশন ব্যাবহার //করলে ভিতরে আর ট্রাই কেচ ব্যবহার না করলেও হয়
    Subclass_Suspend_stop t1 = new Subclass_Suspend_stop(“One”);
    Subclass_Suspend_stop t2 = new Subclass_Suspend_stop(“two”);
    /* Subclass_Suspend_stop নামক ক্লাসের দুইটি অবজেক্ট তৈরি করা হল
    */
    Thread.sleep(1000);
    t1.suspend_(); // t1 থ্রেড কে সাসপেন্ড করা হচ্ছে
    System.out.println(“Thread one is suspending”);
    Thread.sleep(1000);
    t2.suspend_();
    System.out.println(“Thread two is suspending”);
  2. // থ্রেডগুলোকে আবার রিজিউম বা তাদের কাজে ফেরানো হচ্ছে
    Thread.sleep(1000);
    t1.resume_();
    System.out.println(“Thread one is Resuming”);
    Thread.sleep(1000);
    t2.resume_();
    System.out.println(“Thread one is Resuming”);
  3. // থ্রেডকে সাসপেন্ড ও রিজিউমের ক্ষেত্রে thread.sleep() এটিও বড় // ভূমিকা রাখে। থ্রেড টাইমের উপর খেয়াল রেখেই তাদের কাজ // গুলোকে সম্পাদন করে
  4. t1.t.join();
    t2.t.join();
  5. System.out.println(“All thread is finished working”);
  6. }
  7. }
      public class Subclass_Suspend_stop implements Runnable {
      Thread t;
      String name;
      boolean flag; // বুলিয়ান ফ্লাগ, সাসপেন্ড এবং রিজিউম করার // জন্যে
  1. Subclass_Suspend_stop(String name) {
    this.name = name;
    t = new Thread(this, name);
    flag = true; /* থ্রেডের শুরুতে আমরা ফ্লাগকে ট্রু করে দিলাম। সো এটি এখন রিজিউম অবস্থায় আছে তা বুঝায় */
    t.start();
    }
  2. synchronized public void suspend_() {
    flag = false;
    }
  3. /* একসাথে একের অধিক থ্রেড যেন এই মেথোড কে এক্সেস করতে না পারে তার জন্যেই সিঙ্ক্রোনাইজড কিওয়ার্ড ব্যাবহৃত হয়। একটি থ্রেড সিনক্রোনাইজড মেথোডের মধ্যে ডুকলে সেই মেথোদের কাজ শেষ না হওয়া পর্যন্ত অন্য আর কোন থ্রেড সেই মেথোডে প্রবেশ করতে পারেনা */
    synchronized public void resume_() {
    flag = true;
    notify();
    }
      public void run() {
      try {
      for(int i = 0; i<=15; i++) {
      Thread.sleep(500);
      System.out.println(“I am ” + t.currentThread().getName() + ” ” + i);
      synchronized (this) {
      while(flag==false) {
      wait();
      }
      }
      }
      }catch(Exception e) {}
    }
  1. }
    Synchronized (this) {
    }
    /* এই মেথোডটি এক বা একাধিক স্টেইটমেন্টের জন্যে। এখানে ফ্লাগ == false দেওয়ার মানে হচ্ছে থ্রেডটির জন্যে সাসপেন্ড মেথোডকে কল করা হয়েছে। তাই এখানে wait() মেথোড দ্বারা তার কাজ কে বন্ধ বা পরবর্তী নির্দেশ না দেওয়া পর্যন্ত অপেক্ষায় রাখা হয়েছে */
  2. Output:
    I am One 0
    I am two 0
    I am One 1
    I am two 1
    Thread one is suspending
    I am two 2
    Thread two is suspending
    I am two 3
    Thread one is Resuming
    I am One 2
    Thread one is Resuming
    I am One 3
    I am two 4
    I am One 4
    I am One 5
    I am two 5
    All thread is finished working

ashiq
CSE
IIUC

Leave a Reply

Your email address will not be published.

4 × four =