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