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

"এখন আমি আপনাকে ঘুম, ফলন এবং যোগদানের পদ্ধতি সম্পর্কে কিছু বলব।"

"এটি বিরক্তিকর। আমি এইমাত্র একটি সাক্ষাত্কারের প্রশ্ন পেয়েছি: ' ফলন (), ঘুম (), এবং অপেক্ষা () পদ্ধতির মধ্যে পার্থক্য কী ?'। আপনি এটি ব্যাখ্যা করতে পারেন?"

"কোন সমস্যা নেই। প্রথমত, এই তিনটি সম্পূর্ণ ভিন্ন পদ্ধতি।"

1) স্লিপ (টাইমআউট)  - টাইমআউট প্যারামিটার দ্বারা নির্দেশিত মিলিসেকেন্ডের সংখ্যার জন্য বর্তমান থ্রেড (যার উপর ঘুম বলা হয়েছিল) বন্ধ করে। তারপর থ্রেডটি TIMED_WAITING অবস্থায় চলে যায়। isInterrupted পতাকা সেট করা থাকলে পদ্ধতিটি আগে শেষ হতে পারে।

উদাহরণ বর্ণনা
Thread.sleep(500);
বর্তমান থ্রেড 500 মিলিসেকেন্ড বা 0.5 সেকেন্ডের জন্য তার নিজস্ব এক্সিকিউশন স্থগিত করে।

2) yield()  - বর্তমান থ্রেড 'তার পালা এড়িয়ে যায়'। থ্রেডটি চলমান অবস্থা থেকে প্রস্তুত অবস্থায় যায় এবং JVM পরবর্তী থ্রেডে চলে যায়। চলমান এবং প্রস্তুত রাজ্যগুলি চলমান রাজ্যের উপ-রাষ্ট্র।

উদাহরণ বর্ণনা
Thread.yield();
বর্তমান থ্রেড "তার পালা এড়িয়ে যায়" এবং জাভা অবিলম্বে পরবর্তী থ্রেডে সুইচ করে।

3) অপেক্ষা (টাইমআউট)  - এটি অপেক্ষা () পদ্ধতির একটি সংস্করণ, তবে একটি টাইমআউট সহ। " অপেক্ষা পদ্ধতিটি শুধুমাত্র বর্তমান থ্রেড দ্বারা লক করা একটি মিউটেক্স বস্তুর একটি সিঙ্ক্রোনাইজড ব্লকের মধ্যে কল করা যেতে পারে ৷ অন্যথায়, পদ্ধতিটি একটি অবৈধ মনিটরস্টেট ব্যতিক্রম নিক্ষেপ করে৷

"এই পদ্ধতিতে কল করার ফলে মিউটেক্স অবজেক্টের লক রিলিজ হয়ে যায়, এটিকে অন্য থ্রেড অর্জনের জন্য উপলব্ধ করা হয়। অধিকন্তু, থ্রেডটি WAITING অবস্থায় প্রবেশ করে (প্যারামিটার ছাড়াই অপেক্ষা() পদ্ধতির জন্য) অথবা TIMED_WAITING অবস্থায় (অপেক্ষার জন্য (টাইমআউট) ) পদ্ধতি)।"

উদাহরণ বর্ণনা
Object monitor = getMonitor();
synchronized(monitor)
{monitor.wait(500);}
যখন অপেক্ষার পদ্ধতি বলা হয়, বর্তমান থ্রেড মনিটর অবজেক্টের লক প্রকাশ করে এবং 500 মিলিসেকেন্ডের জন্য ঘুমায়। মনিটর বস্তু অন্য থ্রেড দ্বারা অর্জিত হতে পারে.
500 মিলিসেকেন্ডের পরে, থ্রেডটি জেগে উঠবে এবং মনিটরটি ব্যস্ত না থাকলে, থ্রেডটি এটি অর্জন করবে এবং কাজ চালিয়ে যাবে।
মনিটরটি অন্য থ্রেড দ্বারা লক করা থাকলে, বর্তমান থ্রেডটি ব্লকড অবস্থায় চলে যাবে।

4) যোগদান (সময় শেষ)

"এই পদ্ধতিটি আপনার প্রশ্নে ছিল না, কিন্তু এটি আমার পাঠ পরিকল্পনায় রয়েছে, তাই আমি আপনাকে এটি সম্পর্কে বলব। আপনি যখন join() বা join(timeout) পদ্ধতিতে কল করেন, তখন বর্তমান থ্রেডটি থ্রেডের সাথে 'সংযুক্ত' হয় যেটিকে এই পদ্ধতি বলা হয়। বর্তমান থ্রেডটি ঘুমাতে যায় এবং থ্রেডটি শেষ হওয়ার জন্য যুক্ত হওয়া পর্যন্ত অপেক্ষা করে (অর্থাৎ যে থ্রেডটির join() পদ্ধতি বলা হয়েছিল)।"

"বর্তমান থ্রেডটি join() পদ্ধতির জন্য WAITING অবস্থায় এবং join(timeout) পদ্ধতির জন্য TIMED_WAITING অবস্থায় প্রবেশ করে।"

উদাহরণ বর্ণনা
Thread thread = getWorkThread();
thread.join(500);
বর্তমান থ্রেড workerThread থ্রেডে যোগ দেবে এবং এটি শেষ হওয়ার জন্য অপেক্ষা করবে।
কিন্তু এটি 500 মিলিসেকেন্ড পরে 'আনজোইন' হবে এবং চলতে থাকবে।

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

"এটা মনে হচ্ছে যে এই পদ্ধতিগুলির মধ্যে একমাত্র জিনিসটি মিল রয়েছে তা হল সময়সীমা। তারা সম্পূর্ণ ভিন্ন জিনিস করে।"

"হ্যাঁ, এটা ঠিক।"