Java concurrency-তে Thread Interruptions এবং InterruptedException গুরুত্বপূর্ণ ভূমিকা পালন করে। এটি একটি থ্রেডকে আরেকটি থ্রেডের কার্যক্রম বন্ধ করার বা থামানোর সুযোগ দেয়। এটি সাধারণত থ্রেড ব্যবস্থাপনা বা দীর্ঘ-চলমান কাজকে সঠিকভাবে বন্ধ করতে ব্যবহৃত হয়।
Thread Interruptions
Interruptions হল একটি থ্রেডকে সংকেত (signal) দেওয়ার পদ্ধতি, যা নির্দেশ করে যে এটি থামানো উচিত বা একটি নির্দিষ্ট আচরণ করা উচিত। থ্রেড ইন্টারাপশন সরাসরি থ্রেড বন্ধ করে না; এটি কেবল একটি ফ্ল্যাগ সেট করে যা থ্রেডটি যাচাই করতে পারে।
মূল পদ্ধতিগুলি:
- interrupt(): একটি থ্রেডে ইন্টারাপশন সিগন্যাল পাঠায়।
- isInterrupted(): থ্রেডের ইন্টারাপশন ফ্ল্যাগ পরীক্ষা করে।
- Thread.interrupted(): থ্রেডের ইন্টারাপশন ফ্ল্যাগ পরীক্ষা করে এবং এটি রিসেট করে।
InterruptedException
যখন একটি থ্রেড ইন্টারাপ্ট হয় এবং এটি একটি ব্লকিং অপারেশনে (যেমন Thread.sleep(), wait(), বা join()) থাকে, তখন এটি একটি InterruptedException ছুঁড়ে দেয়।
InterruptedException এর প্রয়োজনীয়তা:
- থ্রেডকে সঠিকভাবে বন্ধ করার সুযোগ দেয়।
- সিস্টেমের রিসোর্সের অপচয় কমায়।
- একটি থ্রেডের দীর্ঘ ব্লকিং অপারেশন বন্ধ করে।
Thread Interruptions-এর উদাহরণ
১. সাধারণ ইন্টারাপশন উদাহরণ:
public class ThreadInterruptExample {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
try {
for (int i = 1; i <= 5; i++) {
System.out.println("Running iteration: " + i);
Thread.sleep(1000); // ব্লকিং অপারেশন
}
} catch (InterruptedException e) {
System.out.println("Thread was interrupted during sleep.");
}
});
thread.start();
try {
Thread.sleep(3000); // মূল থ্রেড কিছুক্ষণ অপেক্ষা করে
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt(); // থ্রেডে ইন্টারাপশন সিগন্যাল পাঠানো
System.out.println("Interrupt signal sent to the thread.");
}
}
আউটপুট:
Running iteration: 1
Running iteration: 2
Running iteration: 3
Thread was interrupted during sleep.
Interrupt signal sent to the thread.
২. ইন্টারাপশন ফ্ল্যাগ পরীক্ষা করা:
public class InterruptFlagExample {
public static void main(String[] args) {
Thread thread = new Thread(() -> {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("Thread is running...");
try {
Thread.sleep(500); // ব্লকিং অপারেশন
} catch (InterruptedException e) {
System.out.println("Thread interrupted during sleep.");
Thread.currentThread().interrupt(); // ইন্টারাপশন ফ্ল্যাগ পুনরায় সেট করুন
}
}
System.out.println("Thread is stopping...");
});
thread.start();
try {
Thread.sleep(2000); // কিছুক্ষণ অপেক্ষা করুন
} catch (InterruptedException e) {
e.printStackTrace();
}
thread.interrupt(); // থ্রেডে ইন্টারাপশন সিগন্যাল পাঠান
}
}
আউটপুট:
Thread is running...
Thread is running...
Thread is running...
Thread interrupted during sleep.
Thread is stopping...
InterruptedException এবং Interruptions-এর সঠিক ব্যবহার
- লুপ বন্ধ করা: দীর্ঘ-চলমান লুপ বন্ধ করতে ইন্টারাপশন ব্যবহার করুন।
- রিসোর্স মুক্তি: ইন্টারাপশন পাওয়ার পরে রিসোর্স মুক্ত করুন।
- ইন্টারাপশন ফ্ল্যাগ পুনরায় সেট করা: InterruptedException ধরা হলে
Thread.currentThread().interrupt()ব্যবহার করে ফ্ল্যাগ পুনরায় সেট করুন।
InterruptedException হ্যান্ডলিং এর ভুল ও সঠিক পন্থা
ভুল পন্থা:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace(); // শুধুমাত্র স্ট্যাকট্রেস প্রিন্ট করা
}
সঠিক পন্থা:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // ফ্ল্যাগ পুনরায় সেট করুন
System.out.println("Thread interrupted, exiting gracefully.");
}
Thread Interruptions-এর ব্যবহারিক ক্ষেত্র
- ব্লকিং অপারেশন বন্ধ করা:
sleep(),join(), এবংwait()। - থ্রেড বন্ধ করা: দীর্ঘ-চলমান কাজ বা অপ্রয়োজনীয় থ্রেড থামানো।
- সিস্টেম সিগন্যাল হ্যান্ডলিং: JVM থেকে থ্রেড সিগন্যাল পরিচালনা করা।
Thread Pool এবং Interruptions
যখন ExecutorService বা ThreadPoolExecutor ব্যবহার করা হয়, তখন shutdownNow() ব্যবহার করে থ্রেডে ইন্টারাপশন সিগন্যাল পাঠানো যেতে পারে।
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolInterruptExample {
public static void main(String[] args) {
ExecutorService executor = Executors.newFixedThreadPool(2);
Runnable task = () -> {
try {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("Task is running...");
Thread.sleep(500); // ব্লকিং অপারেশন
}
} catch (InterruptedException e) {
System.out.println("Task interrupted.");
}
};
executor.submit(task);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
executor.shutdownNow(); // থ্রেড বন্ধের জন্য ইন্টারাপশন পাঠান
System.out.println("Executor shutdown requested.");
}
}
- Interruptions থ্রেড পরিচালনার একটি গুরুত্বপূর্ণ টুল।
- InterruptedException সঠিকভাবে হ্যান্ডল করলে থ্রেডের কার্যক্রম সঠিকভাবে বন্ধ করা সম্ভব।
- থ্রেড ইন্টারাপশন ব্যবহার করার সময় সঠিক কৌশল অনুসরণ করুন, যেমন ফ্ল্যাগ পুনরায় সেট করা এবং রিসোর্স মুক্তি নিশ্চিত করা।
Read more