Java-তে multithreading একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা একাধিক থ্রেডের মাধ্যমে একযোগে কাজ করতে সক্ষম করে। প্রতিটি থ্রেড আলাদাভাবে কোডের একটি অংশ চালাতে পারে, এবং একাধিক থ্রেড একে অপরের কাজের সাথে সমান্তরালভাবে কাজ করে।
এখানে, আমরা একটি সাধারণ উদাহরণ দেখবো যেখানে দুটি থ্রেড সমান্তরালভাবে কাজ করবে।
Multithreaded প্রোগ্রাম তৈরি করার ধাপ:
- Thread Class অথবা Runnable Interface ব্যবহার: Java-তে একটি নতুন থ্রেড তৈরি করার দুটি প্রধান উপায় রয়েছে:
- Thread Class এক্সটেন্ড করে।
- Runnable Interface ইমপ্লিমেন্ট করে।
- Thread Start করা:
start()মেথড ব্যবহার করে থ্রেডটি চালু করা হয়। এই মেথড থ্রেডেরrun()মেথডকে কল করে এবং নতুন থ্রেডে কোড চালাতে শুরু করে। - Multithreading Example: নিচে একটি উদাহরণ দেওয়া হয়েছে, যেখানে দুটি থ্রেড আলাদাভাবে কাজ করবে।
উদাহরণ: Thread Class এক্সটেন্ড করে দুইটি থ্রেড চালানো
class Thread1 extends Thread {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Thread 1 - Count: " + i);
try {
Thread.sleep(500); // 500 মিলিসেকেন্ড বিরতি
} catch (InterruptedException e) {
System.out.println(e);
}
}
}
}
class Thread2 extends Thread {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Thread 2 - Count: " + i);
try {
Thread.sleep(500); // 500 মিলিসেকেন্ড বিরতি
} catch (InterruptedException e) {
System.out.println(e);
}
}
}
}
public class MultiThreadExample {
public static void main(String[] args) {
Thread1 t1 = new Thread1(); // Thread 1 ইনস্ট্যান্স
Thread2 t2 = new Thread2(); // Thread 2 ইনস্ট্যান্স
t1.start(); // Thread 1 চালু করা
t2.start(); // Thread 2 চালু করা
}
}
ব্যাখ্যা:
- Thread1 এবং Thread2 দুটি ক্লাস তৈরি করা হয়েছে, যেগুলি Thread ক্লাস থেকে এক্সটেন্ড করে।
- প্রতিটি থ্রেডের
run()মেথডে একটি লুপ চলছে যা প্রতি ৫ বার কাউন্ট করবে এবং ৫০০ মিলিসেকেন্ড বিরতি নিয়ে চলবে। Thread.sleep(500)থ্রেডটিকে ৫০০ মিলিসেকেন্ড সময় বিরতি দিতে ব্যবহৃত হয়, যাতে থ্রেডগুলি সমান্তরালভাবে কাজ করার জন্য পর্যাপ্ত সময় পায়।start()মেথড ব্যবহৃত হয়েছে থ্রেডগুলো চালু করতে।
Runnable Interface ব্যবহার করে Multithreading:
অন্য একটি পদ্ধতি হল Runnable Interface ব্যবহার করে থ্রেড তৈরি করা। এখানে, আমরা Thread ক্লাসের পরিবর্তে Runnable ইন্টারফেস ব্যবহার করবো।
class MyRunnable1 implements Runnable {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Thread 1 - Count: " + i);
try {
Thread.sleep(500); // 500 মিলিসেকেন্ড বিরতি
} catch (InterruptedException e) {
System.out.println(e);
}
}
}
}
class MyRunnable2 implements Runnable {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("Thread 2 - Count: " + i);
try {
Thread.sleep(500); // 500 মিলিসেকেন্ড বিরতি
} catch (InterruptedException e) {
System.out.println(e);
}
}
}
}
public class MultiThreadUsingRunnable {
public static void main(String[] args) {
// Runnable ইন্টারফেস ইমপ্লিমেন্টেশন
MyRunnable1 r1 = new MyRunnable1();
MyRunnable2 r2 = new MyRunnable2();
Thread t1 = new Thread(r1); // Thread 1 তৈরি
Thread t2 = new Thread(r2); // Thread 2 তৈরি
t1.start(); // Thread 1 চালু করা
t2.start(); // Thread 2 চালু করা
}
}
ব্যাখ্যা:
- এখানে, আমরা
Runnableইন্টারফেস ইমপ্লিমেন্ট করেছি এবংrun()মেথডে কাজ নির্ধারণ করেছি। Threadক্লাসের কনস্ট্রাক্টরকেRunnableঅবজেক্ট পাস করা হয়েছে।start()মেথড ব্যবহার করে থ্রেড চালু করা হয়েছে।
Multithreading এর প্রক্রিয়া:
- Thread তৈরি করা:
- Thread Class এক্সটেন্ড করে অথবা Runnable Interface ইমপ্লিমেন্ট করে থ্রেড তৈরি করা যায়।
- Thread Start করা:
start()মেথড ব্যবহার করা হয়, যা থ্রেডেরrun()মেথডকে কল করে।
- Thread Scheduling:
- JVM বা অপারেটিং সিস্টেম থ্রেডের জন্য একটি সিডিউল তৈরি করে এবং নির্দিষ্ট সময়ের মধ্যে থ্রেড চালায়। তবে Java নিজেই থ্রেড সিডিউলিং কন্ট্রোল করে না, এটি OS-এ নির্ভর করে।
- Thread Execution:
- একাধিক থ্রেড সমান্তরালভাবে কাজ করে। তারা CPU কোর বা থ্রেড সিডিউলার দ্বারা টাস্কগুলো একসাথে বা পালাক্রমে কার্যকরী হয়।
- Thread Synchronization:
- যখন একাধিক থ্রেড একে অপরের সাথে সংযুক্ত অবস্থায় কাজ করে, তখন synchronization প্রয়োজন হয়।
synchronizedকিওয়ার্ড ব্যবহারের মাধ্যমে আপনি একটি ব্লক বা মেথডকে সিঙ্ক্রোনাইজড করতে পারেন, যাতে একসাথে একাধিক থ্রেড কাজ না করে।
- যখন একাধিক থ্রেড একে অপরের সাথে সংযুক্ত অবস্থায় কাজ করে, তখন synchronization প্রয়োজন হয়।
Thread Synchronization উদাহরণ:
class Counter {
private int count = 0;
public synchronized void increment() { // সিঙ্ক্রোনাইজড মেথড
count++;
}
public int getCount() {
return count;
}
}
public class ThreadSynchronizationExample {
public static void main(String[] args) {
Counter counter = new Counter();
// Thread 1
Thread t1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
// Thread 2
Thread t2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
t1.start(); // Thread 1 চালু করা
t2.start(); // Thread 2 চালু করা
try {
t1.join(); // থ্রেড 1 শেষ হওয়ার অপেক্ষা
t2.join(); // থ্রেড 2 শেষ হওয়ার অপেক্ষা
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Final count: " + counter.getCount()); // Output: 2000
}
}
Java-তে multithreading ব্যবহার করে আপনি একাধিক কাজ সমান্তরালভাবে করতে পারেন, যা সফটওয়্যারের পারফরম্যান্স এবং রেসপন্সিভনেস বাড়াতে সাহায্য করে। আপনি Thread Class অথবা Runnable Interface ব্যবহার করে থ্রেড তৈরি করতে পারেন এবং তাদের start() মেথড দ্বারা চালু করতে পারেন। যদি একাধিক থ্রেড একই রিসোর্স অ্যাক্সেস করে, তবে সিঙ্ক্রোনাইজেশন প্রয়োজন হতে পারে।
Read more