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

"নতুন সবকিছুই পুরনো কিছু যা আমরা ভুলে গেছি। আজ আমি থ্রেড বন্ধ করার বিষয়ে কথা বলব। আমি আশা করি আপনি ইতিমধ্যেই ভুলে গেছেন কিভাবে interrupt() পদ্ধতি কাজ করে।"

"হ্যাঁ, এলি, আমি পুরোপুরি ভুলে গেছি।"

"দারুণ। তাহলে আমি তোমাকে মনে করিয়ে দেব।"

"জাভাতে, যদি কেউ একটি চলমান থ্রেড বন্ধ করতে চায়, সে থ্রেডে এটি সংকেত দিতে পারে। এটি করার জন্য, আপনাকে থ্রেড অবজেক্টের লুকানো isInterrupted ভেরিয়েবলটিকে সত্যে সেট করতে হবে।"

"প্রতিটি থ্রেডের একটি interrupt() পদ্ধতি রয়েছে, যা এই পতাকা সেট করতে ব্যবহৃত হয়। যখন interrupt () পদ্ধতিটি কল করা হয়, থ্রেড অবজেক্টের ভিতরে isInterrupted ভেরিয়েবলটি সত্যে সেট করা হয়।"

"এবং যখন একটি থ্রেডে Thread.sleep() বা join() পদ্ধতিটি কল করা হয়, তখন পদ্ধতিটি বর্তমান থ্রেডের জন্য isInterrupted পতাকা সেট করা আছে কিনা তা পরীক্ষা করে। যদি এই পতাকা সেট করা হয় (ভেরিয়েবল isInterrupted equals true), তাহলে পদ্ধতিগুলি একটি InterruptedException নিক্ষেপ করুন ।"

"এখানে, আমি আপনাকে একটি পুরানো উদাহরণ মনে করিয়ে দেব:"

কোড বর্ণনা
class Clock implements Runnable
{
public void run()
{
Thread current = Thread.currentThread();

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tik");
}
}
}
ঘড়ির রান পদ্ধতি বর্তমান থ্রেডের জন্য থ্রেড অবজেক্ট পায়।

ক্লক ক্লাস প্রতি সেকেন্ডে একবার কনসোলে "টিক" শব্দটি লিখবে যতক্ষণ না বর্তমান থ্রেডের isInterrupt ভেরিয়েবলটি মিথ্যা।

যখন isInterrupt সত্য হয়ে যায়, রান পদ্ধতিটি বন্ধ হয়ে যায়।

public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clockThread.interrupt();
}
প্রধান থ্রেড একটি শিশু থ্রেড (ঘড়ি) শুরু করে যা চিরতরে চালানো উচিত।

10 সেকেন্ড অপেক্ষা করুন এবং বিঘ্নিত পদ্ধতিতে কল করে কাজটি বাতিল করুন।

মূল থ্রেড তার কাজ শেষ.

ঘড়ির কাঁটা তার কাজ শেষ করে।

"এখানে আমরা রান পদ্ধতিতে একটি অসীম লুপের অংশ হিসাবে ঘুমের পদ্ধতি ব্যবহার করি । লুপে, isInterrupt ভেরিয়েবলটি স্বয়ংক্রিয়ভাবে পরীক্ষা করা হয়। যদি একটি থ্রেড ঘুমের পদ্ধতিকে কল করে, তবে পদ্ধতিটি প্রথমে পরীক্ষা করে যে সেই থ্রেডের জন্য ইন্টারপ্টটি সত্য কিনা ( যেটিকে ঘুমের পদ্ধতি বলা হয়। যদি এটি সত্য হয়, তাহলে পদ্ধতিটি ঘুমাবে না। পরিবর্তে, এটি একটি InterruptedException নিক্ষেপ করে ।"

"কিন্তু এই উদাহরণে, আমরা ক্রমাগত লুপের অবস্থায় isInterrupted ভেরিয়েবল পরীক্ষা করি।"

"আমার মনে আছে কিছু কারণ ছিল কেন আমরা এই পদ্ধতিটি ব্যবহার করতে পারিনি। আপনি কি আমাকে মনে করিয়ে দিতে পারেন?"

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

" দ্বিতীয় , অনেকগুলি বিভিন্ন ক্রিয়া জড়িত কিছু পদ্ধতি কার্যকর করতে খুব দীর্ঘ সময় নিতে পারে।"

" তৃতীয় , একটি ব্যতিক্রম নিক্ষেপ করা isInterrupted চেককে প্রতিস্থাপন করে না। এটি শুধুমাত্র একটি সুবিধাজনক সংযোজন। নিক্ষিপ্ত ব্যতিক্রমটি আপনাকে দ্রুত কল স্ট্যাকটিকে রান পদ্ধতিতে ফিরিয়ে আনতে দেয় "

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

" পঞ্চম , অতিরিক্ত চেক কর্মক্ষমতা হ্রাস করে না। ঘুমের পদ্ধতিকে কল করার অর্থ হল থ্রেডটি কিছু করা উচিত নয় (ঘুমানো ছাড়া), তাই অতিরিক্ত কাজ কাউকে বিরক্ত করে না।"

"আপনি আগে যা বলেছিলেন ঠিক তাই।"

"এবং আপনার বিবৃতি সম্পর্কে কি, « কেউ গ্যারান্টি দিতে পারে না যে একটি থ্রেড বন্ধ করা হবে। শুধুমাত্র একটি থ্রেড নিজেকে থামাতে পারে। » আপনি কি ব্যাখ্যা করতে পারেন?"

"অবশ্যই।"

"আগে, জাভার প্রাথমিক সংস্করণে, থ্রেডগুলির একটি স্টপ() পদ্ধতি ছিল৷ এবং আপনি যখন এটিকে কল করেছিলেন, তখন JVM আসলে থ্রেডটি বন্ধ করে দিয়েছিল৷ কিন্তু যদি একটি থ্রেড JVM-এর বাইরে কিছু করে থাকে (উদাহরণস্বরূপ, একটি ফাইলে লেখা বা কল করা) ওএস ফাংশন) যখন এটি এইভাবে বাধাগ্রস্ত হয়েছিল, তখন বাধা অনেক সমস্যার সৃষ্টি করেছিল, যেমন আনক্লোজড ফাইল, অপ্রকাশিত সিস্টেম রিসোর্স ইত্যাদি।"

"জাভার নির্মাতাদের একটি সাধারণ সভা জোরপূর্বক থ্রেড বন্ধ করার পদ্ধতিটি সরানোর সিদ্ধান্ত নিয়েছে। এখন আমরা যা করতে পারি তা হল একটি নির্দিষ্ট পতাকা (isInterrupted) সেট করা এবং আশা করি যে থ্রেড কোডটি সঠিকভাবে লেখা হয়েছে, যাতে এই পতাকাটি প্রক্রিয়া করা হবে। এটি একটি চিহ্নের মতো যা বলছে, 'থ্রেড, থামুন, প্লিজ। এটা খুবই গুরুত্বপূর্ণ!'। কিন্তু এটা থামবে কি না সেটা তার নিজের ব্যাপার।"

"কিন্তু InterruptedException সম্পর্কে কি?"

"যদি এই থ্রেডে চলমান কোডটিতে একগুচ্ছ ট্রাই-ক্যাচ ব্লক থাকে? এমনকি যদি কোথাও একটি InterruptedException ঘটে, তবে নিশ্চিতভাবে কোন গ্যারান্টি নেই যে কিছু ট্রাই-ক্যাচ এটি ধরবে এবং ভুলে যাবে না। তাই কোন গ্যারান্টি নেই থ্রেড বন্ধ হবে।"

"আরেকটি জিনিস হল যে থ্রেডগুলি ইতিমধ্যেই বেশ নিম্ন-স্তরের প্রোগ্রামিং হিসাবে বিবেচিত হয়। তবে আমি আপনাকে পরের বার এটি সম্পর্কে বলব।"

"তুমি এলি নও - তুমি শেহেরজাদে!"

"তাহলে, আমিগো! বর্তমান পাঠে কি সবকিছু পরিষ্কার?"

"হ্যাঁ।"

"ঠিক আছে, ভালো."