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; } } }