"হাই, অ্যামিগো!"
"হাই, ঋষি!"
"আমি আপনাকে অবজেক্ট ক্লাসের অপেক্ষা , নোটিফাই এবং নোটিফাই সব পদ্ধতির সাথে পরিচয় করিয়ে দিতে যাচ্ছি।"
"আজ আমরা তাদের সাথে পরিচিত হব, তবে আমরা পরে ফিরে আসব এবং এই বিষয়ে আরও সময় ব্যয় করব।"
"ঠিক আছে."
"এই পদ্ধতিগুলি থ্রেড সিঙ্ক্রোনাইজেশন প্রক্রিয়ার অংশ হিসাবে উদ্ভাবিত হয়েছিল।"
"আমাকে মনে করিয়ে দিই যে জাভাতে বিভিন্ন থ্রেড থেকে শেয়ার্ড রিসোর্স (বস্তু) অ্যাক্সেস নিয়ন্ত্রণ করার জন্য একটি অন্তর্নির্মিত ব্যবস্থা রয়েছে৷ একটি থ্রেড ঘোষণা করতে পারে যে একটি বস্তু ব্যস্ত, এবং অন্যান্য থ্রেডগুলিকে ব্যস্ত অবজেক্ট মুক্তি না হওয়া পর্যন্ত অপেক্ষা করতে হবে৷ "
"আমার মনে আছে। আপনি সিঙ্ক্রোনাইজড কীওয়ার্ড ব্যবহার করে তা করেন।"
"ঠিক। সাধারণত, কোডটি এরকম কিছু দেখাবে:"
public void print()
{
Object monitor = getMonitor();
synchronized(monitor)
{
System.out.println("text");
}
}
"মনে আছে এটা কিভাবে কাজ করে?"
"হ্যাঁ। যদি দুটি থ্রেড একই সাথে প্রিন্ট() পদ্ধতিতে কল করে, তাদের মধ্যে একটি সিঙ্ক্রোনাইজড লেবেলযুক্ত ব্লকে প্রবেশ করবে এবং মনিটরটিকে লক করবে, যার ফলে দ্বিতীয় থ্রেডটি মনিটর প্রকাশ না হওয়া পর্যন্ত অপেক্ষা করবে।"
"ঠিক। একবার একটি থ্রেড সিঙ্ক্রোনাইজড লেবেলযুক্ত ব্লকে প্রবেশ করলে, মনিটর অবজেক্টটি ব্যস্ত হিসাবে চিহ্নিত করা হয়, এবং অন্যান্য থ্রেডগুলি মনিটর অবজেক্ট প্রকাশের জন্য অপেক্ষা করতে বাধ্য হবে। একই মনিটর অবজেক্ট প্রোগ্রামের বিভিন্ন অংশে ব্যবহার করা যেতে পারে। "
"বাই দ্য ওয়ে, আপনি মনিটরের নাম কেন বেছে নিলেন?"
"একটি মনিটর হল যাকে আপনি সাধারণত একটি বস্তু বলে থাকেন যা ব্যস্ত বা বিনামূল্যের অবস্থা সঞ্চয় করে।"
"এবং এখানেই অপেক্ষা এবং বিজ্ঞপ্তি পদ্ধতিগুলি কার্যকর হয়।"
"আসলে, এগুলি আসলেই একমাত্র দুটি পদ্ধতি। অন্যগুলি এই পদ্ধতিগুলির অভিযোজন মাত্র।"
"এখন আসুন অপেক্ষার পদ্ধতিটি কী এবং কেন আমাদের এটি দরকার তা নিয়ে মাথা গুটিয়ে নেওয়া যাক। "
"কখনও কখনও একটি প্রোগ্রামে এমন পরিস্থিতি থাকে যেখানে একটি থ্রেড সিঙ্ক্রোনাইজড কোডের একটি ব্লকে প্রবেশ করে এবং মনিটরটিকে লক করে, কিন্তু এটি চালিয়ে যেতে পারে না কারণ এতে কিছু ডেটা অনুপস্থিত থাকে৷ উদাহরণস্বরূপ, এটি প্রক্রিয়া করার জন্য প্রয়োজনীয় একটি ফাইল ডাউনলোড করা শেষ হয়নি বা এরকম কিছু."
"আমরা শুধু ফাইলটি ডাউনলোড হওয়ার জন্য অপেক্ষা করতে পারি। আপনি শুধুমাত্র একটি লুপ ব্যবহার করে এটি পরীক্ষা করতে পারেন। যদি ফাইলটি এখনও ডাউনলোড না হয়ে থাকে, তাহলে এক সেকেন্ডের জন্য ঘুমান, এবং এটি ডাউনলোড না হওয়া পর্যন্ত আবার চেক করুন।"
"এটার মতো কিছু:"
while(!file.isDownloaded())
{
Thread.sleep(1000);
}
processFile(file);
"কিন্তু আমাদের ক্ষেত্রে, এই ধরনের অপেক্ষা করা খুবই ব্যয়বহুল। যেহেতু আমাদের থ্রেড মনিটরটিকে লক করে দিয়েছে, তাই অন্যান্য থ্রেডগুলিও অপেক্ষা করতে বাধ্য হয় যদিও তাদের কাছে ইতিমধ্যেই তাদের প্রয়োজনীয় ডেটা থাকতে পারে।"
" ওয়েট() পদ্ধতিটি এই সমস্যার সমাধান করার জন্য উদ্ভাবিত হয়েছিল৷ এই পদ্ধতির ফলে থ্রেডটি মনিটরটি ছেড়ে দেয় এবং তারপর থ্রেডটিকে «সাসপেন্ড" করে।
"আপনি শুধুমাত্র একটি মনিটর অবজেক্টের অপেক্ষা পদ্ধতিকে কল করতে পারেন যখন মনিটর ব্যস্ত থাকে, অর্থাৎ শুধুমাত্র একটি সিঙ্ক্রোনাইজড ব্লকের ভিতরে। যখন এটি ঘটে, তখন থ্রেডটি সাময়িকভাবে চলা বন্ধ করে দেয়, এবং মনিটরটি ছেড়ে দেওয়া হয় যাতে অন্যান্য থ্রেড এটি ব্যবহার করতে পারে।"
"প্রায়ই এমন উদাহরণ রয়েছে যেখানে একটি থ্রেড একটি সিঙ্ক্রোনাইজড ব্লকে প্রবেশ করবে এবং কল ওয়েট করবে, এইভাবে মনিটরটি মুক্তি পাবে।"
"তারপর একটি দ্বিতীয় থ্রেড প্রবেশ করবে এবং স্থগিত করা হবে, তারপর একটি তৃতীয়, এবং তাই।"
"এবং কিভাবে একটি থ্রেড পুনরায় শুরু হয়?"
"তার জন্য, একটি দ্বিতীয় পদ্ধতি আছে: বিজ্ঞপ্তি।"
"আপনি শুধুমাত্র একটি মনিটর অবজেক্টের notify / notifyসমস্ত পদ্ধতিতে কল করতে পারেন যখন মনিটর ব্যস্ত থাকে, যেমন শুধুমাত্র একটি সিঙ্ক্রোনাইজড ব্লকের ভিতরে। notifyAll পদ্ধতিটি এই মনিটর অবজেক্টে অপেক্ষা করা সমস্ত থ্রেডকে জাগিয়ে তোলে।"
" বিজ্ঞপ্তি পদ্ধতি একটি এলোমেলো থ্রেড 'আনফ্রিজ' করে, কিন্তু notifyAll পদ্ধতি এই মনিটরের সমস্ত «হিমায়িত» থ্রেড আনফ্রিজ করে।"
"খুব আকর্ষণীয়। ধন্যবাদ, ঋষি।"
"ওয়েট() পদ্ধতির অভিযোজনও রয়েছে:"
অপেক্ষা () পদ্ধতি | ব্যাখ্যা |
---|---|
|
থ্রেডটি "হিমায়িত হয়", তবে এটি স্বয়ংক্রিয়ভাবে "আনফ্রিজ" হয়ে যায় মিলিসেকেন্ডের সংখ্যা অপেক্ষা করার পরে একটি যুক্তি হিসাবে পদ্ধতিতে পাস করা হয়। |
|
থ্রেড "হিমায়িত", কিন্তু এটি স্বয়ংক্রিয়ভাবে "আনফ্রিজ" একটি যুক্তি হিসাবে পদ্ধতিতে পাস করা ন্যানোসেকেন্ডের সংখ্যা অপেক্ষা করার পরে। |
"আমরা এটিকে একটি টাইমআউট সহ একটি অপেক্ষাও বলি৷ পদ্ধতিটি একটি সাধারণ অপেক্ষার মতো কাজ করে, তবে যদি নির্দিষ্ট সময় অতিক্রান্ত হয়ে যায় এবং থ্রেডটি জেগে না থাকে তবে এটি নিজেই জেগে ওঠে।"
GO TO FULL VERSION