থ্রেড তৈরি এবং ম্যানেজ করা

জাভা কনকারেন্সি - জাভা প্রোগ্রামিং (Java Programming) - Computer Programming

366

Java তে থ্রেড তৈরি এবং ম্যানেজ করা একটি গুরুত্বপূর্ণ কাজ, যা প্রোগ্রামের পারফরম্যান্স এবং কার্যক্ষমতা বাড়াতে সাহায্য করে। মাল্টি-থ্রেডিংয়ের মাধ্যমে একটি প্রোগ্রামের একাধিক কাজ একসাথে সম্পন্ন করা সম্ভব হয়। Java তে থ্রেড তৈরি করার জন্য মূলত Thread ক্লাস এবং Runnable ইন্টারফেস ব্যবহৃত হয়।


থ্রেড কী?

থ্রেড হলো একটি ছোট এক্সিকিউশন ইউনিট যা প্রোগ্রামের ভেতরে একাধিক কাজ একসাথে সম্পন্ন করতে সহায়ক। Java তে Thread ক্লাস এবং Runnable ইন্টারফেস ব্যবহার করে থ্রেড তৈরি করা যায়।


থ্রেড তৈরি করার পদ্ধতি

Java তে থ্রেড তৈরি করার প্রধান দুটি পদ্ধতি রয়েছে:

  1. Thread ক্লাস প্রসারিত (Extend) করে
  2. Runnable ইন্টারফেস ইমপ্লিমেন্ট (Implement) করে

১. Thread ক্লাস প্রসারিত করে থ্রেড তৈরি করা

Thread ক্লাস প্রসারিত করে নতুন থ্রেড তৈরি করা যায়, যেখানে run() মেথড ওভাররাইড করে নির্দিষ্ট কাজ সম্পন্ন করা হয়।

class MyThread extends Thread {
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + " - " + i);
        }
    }
}

public class ThreadExample {
    public static void main(String[] args) {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();

        thread1.start(); // থ্রেড শুরু করা
        thread2.start();
    }
}

ব্যাখ্যা:

  • MyThread ক্লাসটি Thread ক্লাস প্রসারিত করে এবং run() মেথড ওভাররাইড করে কাজ সম্পন্ন করেছে।
  • start() মেথড থ্রেড চালায়, যার ফলে run() মেথড কার্যকর হয়।

২. Runnable ইন্টারফেস ইমপ্লিমেন্ট করে থ্রেড তৈরি করা

Runnable ইন্টারফেস ইমপ্লিমেন্ট করে থ্রেড তৈরি করা যায়, যা Java-র অন্যতম জনপ্রিয় পদ্ধতি। এই পদ্ধতিতে run() মেথড ওভাররাইড করতে হয় এবং Thread অবজেক্টের মাধ্যমে থ্রেড চালানো হয়।

class MyRunnable implements Runnable {
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + " - " + i);
        }
    }
}

public class RunnableExample {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new MyRunnable());
        Thread thread2 = new Thread(new MyRunnable());

        thread1.start(); // থ্রেড শুরু করা
        thread2.start();
    }
}

ব্যাখ্যা:

  • MyRunnable ক্লাস Runnable ইন্টারফেস ইমপ্লিমেন্ট করেছে এবং run() মেথড ওভাররাইড করেছে।
  • নতুন Thread অবজেক্ট তৈরি করে start() মেথড ব্যবহার করে থ্রেড চালানো হয়েছে।

থ্রেড ম্যানেজমেন্টের কিছু গুরুত্বপূর্ণ মেথড

Java তে থ্রেড ম্যানেজমেন্টের জন্য বিভিন্ন মেথড রয়েছে, যা থ্রেডের স্টেটস নিয়ন্ত্রণ করতে এবং কার্যক্ষমতা বাড়াতে সহায়ক:

  1. start(): থ্রেড চালু করার জন্য ব্যবহৃত হয় এবং run() মেথড কার্যকর হয়।
  2. run(): থ্রেডে সম্পন্ন করতে ইচ্ছুক কাজ নির্ধারণ করে।
  3. sleep(long milliseconds): নির্দিষ্ট সময়ের জন্য থ্রেডকে থামিয়ে দেয়।
  4. join(): অন্য থ্রেড শেষ না হওয়া পর্যন্ত বর্তমান থ্রেডকে অপেক্ষা করতে বাধ্য করে।
  5. interrupt(): থ্রেডকে থামানোর সংকেত দেয়।
  6. isAlive(): থ্রেড সক্রিয় কিনা তা পরীক্ষা করে।

উদাহরণ: sleep() এবং join() মেথড ব্যবহার

class MyThread extends Thread {
    public void run() {
        for (int i = 1; i <= 5; i++) {
            System.out.println(Thread.currentThread().getName() + " - " + i);
            try {
                Thread.sleep(1000); // ১ সেকেন্ড থামিয়ে দেয়
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class ThreadSleepJoinExample {
    public static void main(String[] args) throws InterruptedException {
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();

        thread1.start();
        thread1.join(); // thread1 শেষ না হওয়া পর্যন্ত অপেক্ষা করে

        thread2.start();
    }
}

ব্যাখ্যা:

  • sleep(1000) মেথড ব্যবহার করে প্রতিবার ১ সেকেন্ড থ্রেডকে থামিয়ে দেয়।
  • join() মেথড thread1 সম্পন্ন না হওয়া পর্যন্ত thread2 কে অপেক্ষা করায়।

থ্রেড পুল ব্যবহারের মাধ্যমে থ্রেড ম্যানেজমেন্ট

থ্রেড পুল হলো থ্রেড ম্যানেজমেন্টের একটি পদ্ধতি, যা থ্রেড পুনর্ব্যবহারযোগ্য করে। থ্রেড পুল ব্যবহার করলে প্রতিবার নতুন থ্রেড তৈরি না করে বিদ্যমান থ্রেড পুনরায় ব্যবহার করা যায়, যা সিস্টেমের কার্যক্ষমতা বাড়ায়।

ExecutorService এবং থ্রেড পুল উদাহরণ

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class Task implements Runnable {
    public void run() {
        System.out.println(Thread.currentThread().getName() + " is executing a task.");
    }
}

public class ThreadPoolExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(3); // ৩টি থ্রেডের পুল তৈরি

        for (int i = 0; i < 5; i++) {
            executor.submit(new Task()); // প্রতিটি টাস্ক সাবমিট করা
        }

        executor.shutdown(); // থ্রেড পুল বন্ধ করা
    }
}

আউটপুট:

pool-1-thread-1 is executing a task.
pool-1-thread-2 is executing a task.
pool-1-thread-3 is executing a task.
...

ব্যাখ্যা:

  • এখানে Executors.newFixedThreadPool(3) ব্যবহার করে ৩টি থ্রেডের একটি পুল তৈরি করা হয়েছে।
  • submit() মেথড ব্যবহার করে থ্রেড পুলে টাস্ক যুক্ত করা হয়েছে।

থ্রেড ম্যানেজমেন্টের চ্যালেঞ্জসমূহ

  1. Deadlock: একাধিক থ্রেড একে অপরের উপর নির্ভরশীল হলে deadlock তৈরি হয়, যা থ্রেড স্থবির করে দেয়।
  2. Race Condition: একাধিক থ্রেড একই ডেটা একসাথে পরিবর্তন করতে চাইলে ডেটা অসঙ্গতি ঘটে।
  3. সিঙ্ক্রোনাইজেশন প্রয়োজন: একাধিক থ্রেড ডেটা শেয়ার করলে সঠিকভাবে সিঙ্ক্রোনাইজ করা প্রয়োজন, যাতে ডেটা ম্যানিপুলেশন নির্ভুল হয়।

থ্রেড নিরাপত্তা নিশ্চিত করতে সিঙ্ক্রোনাইজেশন

একাধিক থ্রেড একই ডেটা অ্যাক্সেস করলে ডেটা ইনকনসিস্টেন্সি সমস্যা তৈরি হতে পারে। এই সমস্যা সমাধানের জন্য সিঙ্ক্রোনাইজেশন ব্যবহার করা হয়।

class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }
}

public class SynchronizedExample {
    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();

        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });

        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();

        System.out.println("Final count: " + counter.getCount());
    }
}

আউটপুট:

Final count: 2000

ব্যাখ্যা: increment() মেথডটি synchronized করে দেয়া হয়েছে, যার ফলে একবারে শুধুমাত্র একটি থ্রেড এই মেথড অ্যাক্সেস করতে পারে, এবং ডেটা ইনকনসিস্টেন্সি এড়ানো সম্ভব হয়েছে।


সারসংক্ষেপ

Java তে থ্রেড তৈরি এবং ম্যানেজ করা বড় প্রোগ্রাম বা অ্যাপ্লিকেশনের কার্যক্ষমতা বাড়ায়। Thread ক্লাস বা Runnable ইন্টারফেস ব্যবহার করে থ্রেড তৈরি করা যায়। ExecutorService এবং থ্রেড পুল ব্যবহার করে কার্যক্ষম থ্রেড ম্যানেজমেন্ট নিশ্চিত করা যায়। থ্রেড নিরাপত্তার জন্য সিঙ্ক্রোনাইজেশন এবং deadlock বা race condition এর মতো সমস্যা এড়াতে সতর্ক থাকা প্রয়োজন। Java কনকারেন্সির সঠিক ব্যবহার বড় অ্যাপ্লিকেশনে পারফরম্যান্স বাড়াতে সহায়ক।

Content added By
Promotion

Are you sure to start over?

Loading...