"হাই, অ্যামিগো!

"আমি আপনাকে ছোট, কিন্তু আকর্ষণীয় কিছু সম্পর্কে বলতে চাই।"

"আমি শুনছি। আমি ছোট এবং আকর্ষণীয় জিনিস পছন্দ করি।"

"ঠিক আছে, আপনি জানেন যে প্রতিটি থ্রেড অবজেক্টের একটি রান() পদ্ধতি রয়েছে। এবং আপনি start() পদ্ধতি ব্যবহার করে এটি একটি পৃথক থ্রেডে কার্যকর করতে পারেন।"

"হ্যা অবশ্যই."

"কিন্তু এখন এই পরিস্থিতিটি কল্পনা করুন: আপনি কিছু কাজ সম্পাদন করার জন্য একটি থ্রেড শুরু করেন, কিন্তু একটি ব্যতিক্রম নিক্ষেপ করা হয় এবং থ্রেডটি বন্ধ হয়ে যায় কারণ এটি কী করতে হবে তা জানে না। এই ত্রুটিটি সম্পর্কে আপনার কি কোনোভাবে জানার প্রয়োজন হবে না?"

"আমি একমত। অন্য চলমান থ্রেডে যে ব্যতিক্রম ঘটেছে তা আমাকে কোনোভাবে ধরতে হবে। জাভা কি এটি সমর্থন করে?"

"আপনি আমাকে অপমান করছেন। অবশ্যই তা করে।"

"জাভার নির্মাতারা UncaughtExceptionHandler নামে একটি বিশেষ ইন্টারফেস উদ্ভাবন করেছেন। অন্য থ্রেডে ঘটে যাওয়া ব্যতিক্রমটি কীভাবে ধরবেন এবং পরিচালনা করবেন, যদি সেই থ্রেডটি এটি না ধরতে পারে:"

উদাহরণ
public class DownloadManager
{
 public static void main(String[] args)
 {
   Thread thread = new DownloadThread();
   thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
   {
    @Override
    public void uncaughtException(Thread t, Throwable e)
    {

    }
 });

 thread.start();
}

"থ্রেড অবজেক্টের একটি বিশেষ সেটUncaughtExceptionHandler পদ্ধতি রয়েছে। আপনাকে এটিকে একটি অবজেক্ট পাস করতে হবে যা Thread.UncaughtExceptionHandler ইন্টারফেস প্রয়োগ করে। এই ইন্টারফেসে শুধুমাত্র একটি পদ্ধতি রয়েছে: uncaughtException(Thread t, Throwable e) । এটি সেই পদ্ধতি যা কল করা হবে। পাস করা অবজেক্ট যদি রান পদ্ধতিতে কোনো ধরা না পড়া ব্যতিক্রম ঘটে।"

"উপরের আমার উদাহরণে, আমি কেবল একটি বেনামী অভ্যন্তরীণ শ্রেণী ঘোষণা করি (লাল রঙে হাইলাইট করা) যা থ্রেড প্রয়োগ করে। Thread.UncaughtExceptionHandler ইন্টারফেস। এবং আমি এর uncaughtException(Thread t, Throwable e) পদ্ধতিকে ওভাররাইড করি।"

"যেমন আপনি পদ্ধতির প্যারামিটার তালিকা থেকে দেখতে পাচ্ছেন, দুটি আর্গুমেন্ট পাস করা হবে: থ্রেড অবজেক্টের একটি রেফারেন্স যেখানে ব্যতিক্রম ঘটেছে, এবং ব্যতিক্রমটি নিজেই, থ্রোয়েবল ই হিসাবে পাস করা হয়েছে।"

"আচ্ছা, কেন আমার থ্রেড ভেরিয়েবল টি দরকার? আমরা কি ইতিমধ্যে জানি না কোন থ্রেডে আমরা একটি থ্রেড রাখছি। UncaughtExceptionHandler অবজেক্টে?"

"তারা এটি করেছে যাতে আপনি এই পরিস্থিতিগুলির জন্য একটি সার্বজনীন হ্যান্ডলার লিখতে পারেন৷ অর্থাৎ আপনি একটি একক বস্তু তৈরি করতে পারেন এবং এটি কয়েক ডজন বিভিন্ন থ্রেডে পাস করতে পারেন৷ তারপর uncaughtException (Thread t, Throwable e) পদ্ধতিটি সর্বদা আপনাকে একটি রেফারেন্স দেয় থ্রেড অবজেক্ট যেখানে ব্যতিক্রম ঘটেছে।"

"আরও কি, আপনি কয়েক ডজন থ্রেড তৈরি করতে পারেন, উদাহরণস্বরূপ, নির্দিষ্ট কাজগুলি করার জন্য একটি লুপে। সাধারণভাবে, থ্রেড অবজেক্টের এই রেফারেন্সটি অতিরিক্ত হবে না। আমি আপনাকে প্রতিশ্রুতি দিচ্ছি।"

"আমি তোমাকে বিশ্বাস করি। তুমি কখনো ভুল করোনি।"