Thread termination
কি কি কারনে থ্রেড বন্ধ করে দিব
- যদি থ্রেড ঠিকমত কাজ না করে তাহকে বন্ধ করে দেয়া উচিত
- থ্রেড কিছু না করলে কম্পিউটার রিসোর্স দখল করে বসে থাকে, তাই কাজে না লাগা বা কাজ শেষে থ্রেড বন্ধ করে দেয়া উচিত
- যদি মেইন থ্রেড চালু না থাকে কিছু অন্য একটা থ্রেড চালু থাকলে এপ্লিকেশন বন্ধ হয় না, সেক্ষেত্রে বাধ্য হয়ে বন্ধ করে দিতে হয়
কখন থ্রেড বন্ধ করে দিব
- যদি থ্রেড এমন একটা মেথড চালায় যেখান থেকে InterruptedException এরর হয়েছে
- যদি থ্রেড কোড ইন্টারাপ্ট সিগ্নাল পায়
- যদি এমন হয় যে আমরা থ্রেডকে এপ্লিকেশন এর সাথে সংশ্লিষ্ট করতে চাইনা, তাহলে থ্রেডকে ডেমন থ্রেড করে দেয়া যেতে পারে। ডেমন থ্রেড এপ্লিকেশন বন্ধ করতে অসুবিধা করে না thread.setDaemon(true);
মেথড থেকে InterruptedException এরর হয়েছে
public class ThreadInterrupt {
public static void main(String[] args) {
Thread thread = new Thread(new BlockingTask());
thread.start();
thread.interrupt();
}
private static class BlockingTask implements Runnable {
@Override
public void run() {
try {
Thread.sleep(50000);
} catch (InterruptedException e) {
System.out.println("I've been interrupted");
}
}
}
}যখন থ্রেড কোড ইনটারাপ্ট সিগ্নাল পায়
import java.math.BigInteger;
public class ThreadInterrupt2 {
public static void main(String[] args) {
Thread thread = new Thread(new LongComputingTask(new BigInteger("200000"), new BigInteger("1000000")));
thread.start();
thread.interrupt();
}
private static class LongComputingTask implements Runnable {
private final BigInteger base;
private final BigInteger power;
public LongComputingTask(BigInteger base, BigInteger power) {
this.base = base;
this.power = power;
}
@Override
public void run() {
System.out.println(base + "^" + power +"=" + pow(base, power));
}
private BigInteger pow(BigInteger base, BigInteger power) {
BigInteger result = BigInteger.ONE;
for (BigInteger i = BigInteger.ZERO; i.compareTo(power) != 0; i = i.add(BigInteger.ONE)) {
if(Thread.currentThread().isInterrupted()) {
System.out.println("Prematurely interrupted computation");
return BigInteger.ZERO;
}
result = result.multiply(base);
}
return result;
}
}
}