জাভা থ্রেড যেভাবে কাজ করে

ধরি আমরা মাইক্রোসফট ওয়ার্ডে উপরের লাইনটি লিখলাম। উপরের লাইনটি যখন লিখছি তখন এখানে দুটি প্রসেস সংঘটিত হচ্ছে একটি প্রসেসে স্পেলিং চেক হচ্ছে অন্য একটি প্রসেসে ফাইলটি সেভ করা থাকলে অটো সেভ হচ্ছে। আর পুরো একটি মাইক্রোসফট ওয়ার্ড অপেন আছে এটিও একটি প্রসেস। সুতরাং থ্রেড হচ্ছে একটি প্রসেসের মধ্যে একই সময়ে চলমান একাধিক প্রসেস।

ধরি উপরেরটি যেকোন একটি কাজ বা সমস্যা। উপরের কাজটি সম্পন্ন করতে একজন প্রোগ্রামার এর ১০০মিনিট সময় লাগে। যদি কাজটি ৪জন প্রোগ্রামার একই সময়ে একসাথে করে তাহলে তাদের সময় লাগে ২৫ মিনিট। ঠিক থ্রেডও সেরকম। একটি কাজকে ভিন্ন ভিন্ন থ্রেডে করা যায়। যখন আমরা প্রোগাম করি সেটিও  একটি ডিফল্ট  থ্রেডে সম্পন্ন হয়। থ্রেডটিন নাম হচ্ছে main থ্রেড।

উপরে ইরর এর মধ্যে বলতেছে আমদের মেইন থ্রেড এর মধ্যে একটি একসেপশন আছে।

থ্রেড যেভাবে কাজ করে:

থ্রেড দুভাবে তৈরি করা যায়:

  1. Thread class কে এক্সটেন্ড করে।
  2. Runnable interface কে ইপ্লিমেন্ট করে।

Thread class কে এক্সটেন্ড এর মাধ্যমে থ্রেড তৈরি:

এখানে Thread ক্লাসকে এক্সটেন্ড করার মাধ্যমে থ্রেড তৈরি করা হয়েছে। থ্রেডের একটি মেথডে আছে run().  ঐ মেথডটিকে Override করে এর মধ্যে যাবতীয় কাজ করতে হয়।

Output এবং বর্ণনা:

১. উপরের চিত্রে  Thread ক্লাসকে একস্টেন্ড করে ThreadWithExtend একটি থ্রেড তৈরি করা হয়েছে।

২. প্রোগ্রাম সবসময় মেইন মেথড থেকে বা মেইন থ্রেড থেকে রান হয়। উপরের চিত্রে যেহেতু Thread ক্লাসকে একস্টেন্ড করছে ThreadWithExtend class, তাই মেইন মেথডে ThreadWithExtend ক্লাসের অবজেক্ট তৈরি করা হল।

৩.তারপর obj.start()[run মেথডকে কল দিতে  এটি ব্যবহার করা হয়েছে] এর মাধ্যমে run মেথডটিকে স্টার্ট করার জন্য কল দেয়া হল।

৪. এটি কল হতে হতে  obj.start() এর নিচে যে  লোপ চালানো হয়েছে সেখানে  ঢুকল এবং Main Tread লিখাটি একবার প্রিন্ট করল এবং ৫০০ মিলিসেকেন্ড মেইন থ্রেডটি অফ(এখানে Thread.sleep(500)  এর মাধ্যমে লোপটিকে ৫০০ মিলি সেকেন্ড অফ করে রাখা হয়েছে) থাকল।

৫. যখন মেইন থ্রেডটি  অফ হয়ে যায় ততক্ষণে obj.start() এর মাধ্যমে যে run মেথডটিকে স্টার্ট করার জন্য কল দেয়া হয়েছিল সেটিতে গেল এবং এখানেও একটি লোপ চালানো হয়েছে সেই লোপের মধ্যে ঢুকে Thread one লিখাটি একবার প্রিন্ট করল।

৬.তারপর ৫০০ মিলিসেকেন্ড  ThreadWithExtend থ্রেডটা অফ থাকল। ততক্ষনে সেটি আবার  মেইন থ্রেডে ফিরে গেল  এবং আবার obj.start() এর মাধ্যমে run মেথডটিকে স্টার্ট করার জন্য কল দেয়া হল। এটি কল হতে হতে  obj.start() এর নিচে যে  লোপ চালানো হয়েছে সেখানে  ঢুকল এবং Main Tread লিখাটি একবার প্রিন্ট করল এবং ৫০০ মিলিসেকেন্ড মেইন থ্রেডটি  অফ থাকল।

৭. যখন মেইন থ্রেডটি  অফ হয়ে যায় ততক্ষণে obj.start() এর মাধ্যমে যে run মেথডটিকে স্টার্ট করার জন্য কল দেয়া হয়েছিল সেটিতে গেল এবং আবার ThreadWithExtend থ্রেডের এর লুপে ঢুকল এবং ততক্ষনে লুপটি দুইবার ঘুরল। তাই  Thread one দুইবার প্রিন্ট করছে।

এভাবে চলল.।

নোট: এখানে ৫০০ মিলি সেকেন্ডের মধ্যে লুপ কত দ্রুত চলবে  তা প্রসেসর নির্ধারণ করে বা অন্যান্য অনেক বিষয়ের উপর নির্ভর করে তাই এটি আবার প্রিন্ট করলে  একই আউটফুট আসবেনা বা না আসতে পারে।

Runnable interface কে ইপ্লিমেন্ট করে থ্রেড তৈরি:  

 

১.এখানে সব Runnable interface কে ইপ্লিমেন্ট করার মাধ্যমে ThredWithExtend নামে একটি থ্রেড তৈরি করা হয়েছে।

২. মেইন মেথডে বা থ্রেডে এর ঐ(ThredWithExtend)  ক্লাসের অবজেক্ট যেভাবে তৈরি করেছি ওভাবে তৈরি করতে হবে।

৩.  t1.start() এর মাধ্যমে run মেথডকে কল দেয়া হয়েছে।

তারপর সব একই ভাবে আগের বর্ণনার মত কাজ করে। তাই ব্যাখ্যা করা হল না। 

থ্রেড তৈরি করার সময় এটির নাম specify করে দেয়া:

থ্রেড তৈরি করার সময় এটির নাম specify করে দেয়া যায়। যার জন্য থ্রেড ক্লাসের অবজেক্ট তৈরির করার সময় প্যারমিটারের ভিতরে কমা দিয়ে থ্রেডের নাম দিয়ে দেয়া যায়। আর getName এর মাধ্যমে থ্রেডটির নাম পাওয়া যায়।

currentThread হচ্ছে থ্রেড ক্লাসের একটি  স্ট্যাটিক মেথড। এটির সাহয্যে যে থ্রেড execute হচ্ছে  সেটির একটি অবজেক্ট রিটার্ন করে। এর মেথডের মাধ্যমে থ্রেডটি যে থ্রেডের মধ্যে অবস্থান করে তার নাম গেট করা যায়।

 

আরে কিছু উদাহারণ:

১নং চিত্রের মধ্যে x এর মান 100000 প্রিন্ট করার কথা, কিন্তু প্রিন্ট করতেছে 0.  কারণ আমরা জানি ইন্সট্যান্স ভ্যারিয়েবলের ডিফল ভ্যালু 0. যখন obj.x এর সাহায্যে x এর মান প্রিন্ট করা হচ্ছে তখন x এর মান ডিফল ভ্যালু যেটি ছিল সেটি প্রিন্ট করে দিচ্ছে কারণ ThredWithExtend ক্লাসের লোপটি তখনও চলা শুরু করেনি বা ওই থ্রেডটি তখনও start হয়নি।

২নং চিত্রে t1.start মেথডের মাধ্যমে run()  মেথডকে কল দেয়া হল। তরপর মেইন মেথডের থ্রডটিকে ১মিলিসেকেন্ড থামিয়ে রাখা হল। ততক্ষনে ThredWithExtend ক্লাসের থ্রেডটি যতক্ষন সময় পেল ততক্ষন লোপটি ঘুরল।  obj.x  কল  হতে হতে x এর মান পরিবর্তন হয়ে গেলে। তাই x এর মান 99102 প্রিন্ট করল। এখানে x এর মান সবসময় এক হবে না। কারণ এটি পিসির কনফিগারেশন এর উপর বা অন্যান্য অনেক বিষয়ের উপর নির্ভর করে।

join মেথডের মাধ্যমে থ্রেডকে থামিয়ে রাখা যায়:

৩ নং চিত্রে join মেথডের মাধ্যমে প্রথম থ্রেডটিকে থামিয়ে রাখা হয় ততক্ষন পর্যন্ত যতক্ষন না ThredWithExtend ক্লাসের থ্রেডের কাজ শেষ হচ্ছে। ThredWithExtend ক্লাসের থ্রেডের কাজ শেষ হলে আবার মেইন থ্রেডে ফিরে গিয়ে তার কাজগুলো সম্পন্ন করছে।

isAlive() Method: কোন থ্রেড চলমান আছে কিনা দেখার জন্য isAlive() Method মেথড ব্যবহার করা হয়। এটি বুলিয়ান ভ্যালু প্রিন্ট করে। যদি চলমান থাকে তাহলে true প্রিন্ট করে আর না থাকলে flase প্রিন্ট করে।

 

NonDaemon Thread: যে থ্রেড মেইন থ্রেড শেষ হওয়ার পরেও নিজের কাজগুলো করতে থাকে তাকে নন ডিমন থ্রেড বা ইউজার থ্রেড বলে।

Daemon Thread: NonDaemon থ্রেডকে Daemon থ্রেড করা। অর্থাৎ মেইন মেথড শেষ হওয়ার পর অন্য থ্রেডের প্রসেস থামিয়ে দেয়াকে Daemon থ্রেড বলে।

এখানে ১, ২, ৩…. প্রিন্ট করার কারণ হচ্ছে প্রথমে মেইন থ্রেডটি ThredWithExtend এর একটি অবজেক্ট তৈরি করল। অবজেক্ট তৈরি করার পর ThredWithExtend ক্লাসের ট্রেডটিকে ডিমন ট্রেড করে দিল। তারপর run মেথডকে কল দেয়া হল। রান মেথডকে যখন কল দিল তখনও মেইন থ্রেডের নির্বাহ শেষ হয়নি। শেষ হতে হতে run মেথডের ভিতরে ঢুকে প্রিন্ট করা শুরু করল। যখনই Main থ্রেডের কাজ বন্ধ হয়ে গেল সাথে সাথে অন্য থ্রেডটিও বন্ধ হয়ে গেল। মেইন থ্রেড বন্ধ হতে হতে যতক্ষত সময় পেল লুপ ততক্ষন চলল এবং প্রিন্ট করল। এই একই প্রোগ্রাম আবার রান করলে একই মান আসবে না। কারণ এটি পিসির কনফিগারেশন এর উপর বা অন্যান্য অনেক বিষয়ের উপর নির্ভর করে। নিচে  একই প্রোগ্রামের আরেকটি করা ছবি দেয়া হল:

Level 1

আমি মোহাম্মদ আক্তারুজ্জামান। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 4 বছর 8 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 4 টি টিউন ও 0 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 1 ফলোয়ার আছে এবং আমি টেকটিউনসে 1 টিউনারকে ফলো করি।

I have completed my diploma engineering degree in 2021. As a computer diploma engineer, I have various knowledge about computer-related work. I have been working successfully in various freelancing marketplaces since 2016 as a GRAPHIC DESIGNER. In 2017, I completed a course on FRONT END WEB DEVELOPMENT from a reputed...


টিউনস


আরও টিউনস


টিউনারের আরও টিউনস


টিউমেন্টস