java অপেক্ষা () এবং ঘুম () মধ্যে পার্থক্য





15 Answers

একটি কী পার্থক্য এখনও উল্লেখ করা হয় না যে একটি থ্রেড ঘুমানোর সময় এটি বন্ধ থাকা লকগুলি ছেড়ে দেয় না , অপেক্ষার সময় অপেক্ষারত বস্তুর উপর লক প্রকাশ করে wait() বলা হয়।

synchronized(LOCK) {
    Thread.sleep(1000); // LOCK is held
}


synchronized(LOCK) {
    LOCK.wait(); // LOCK is not held
}
java multithreading sleep java-threads

থ্রেডে wait() এবং sleep() মধ্যে পার্থক্য কী?

আমার বোঝার যে একটি wait() -র থ্রেড এখনও চলমান মোডে চলছে এবং CPU চক্র ব্যবহার করে কিন্তু একটি sleep() -ইং কোন CPU চক্রগুলি সঠিকভাবে গ্রাস করে না?

কেন আমরা উভয় wait() এবং sleep() : তাদের বাস্তবায়ন একটি নিম্ন স্তরে কিভাবে পরিবর্তিত হয়?




এখানে প্রচুর উত্তর আছে কিন্তু আমি যে কোনও শব্দগত পার্থক্য খুঁজে পাইনি।

এটা থ্রেড নিজেই সম্পর্কে না; উভয় পদ্ধতির প্রয়োজন তারা খুব ভিন্ন ব্যবহারের ক্ষেত্রে সমর্থন করে।

sleep() থ্রেডকে sleep() পাঠায়, এটি কেবল প্রসঙ্গটিকে প্যাক করে এবং পূর্বনির্ধারিত সময়ের জন্য কার্যকর করা বন্ধ করে দেয়। সুতরাং যথাযথ সময়ের আগে এটি জাগানোর জন্য আপনাকে থ্রেড রেফারেন্সটি জানতে হবে। এটি একটি বহু-থ্রেড পরিবেশে একটি সাধারণ পরিস্থিতি নয়। এটি বেশিরভাগ সময়-সিঙ্ক্রোনাইজেশনের জন্য ব্যবহৃত হয় (যেমন 3.5 সেকেন্ডের মধ্যে জাগ্রত) এবং / অথবা হার্ড-কোডেড ন্যায্যতা (শুধুমাত্র কিছু সময়ের জন্য ঘুমাতে এবং অন্যদের থ্রেডগুলি কাজ করতে দেয়)।

wait() , বিপরীতভাবে, একটি থ্রেড (বা বার্তা) সিঙ্ক্রোনাইজেশন প্রক্রিয়া যা আপনাকে একটি থ্রেড অবহিত করার অনুমতি দেয় যা আপনার কোন সংরক্ষিত রেফারেন্স (নাও যত্ন) থাকে। আপনি এটি একটি প্রকাশ-সাবস্ক্রাইব প্যাটার্ন হিসাবে মনে করতে পারেন ( wait == সাবস্ক্রাইব করুন এবং notify() == প্রকাশ করুন)। মূলত অবহিত করা ব্যবহার করে () আপনি একটি বার্তা পাঠাচ্ছেন (যা এমনকি সব সময়ে পাওয়া যাবে না এবং সাধারণত আপনি যত্ন নিচ্ছেন না)।

সমষ্টিগতভাবে, আপনি সাধারণত সময়-সিঙ্ক্রোনাইজাইজেশনের জন্য sleep() ব্যবহার করেন এবং মাল্টি-থ্রেড-সিঙ্ক্রোনাইজেশনের জন্য wait()

তারা অন্তর্নিহিত ওএস-এ একই পদ্ধতিতে প্রয়োগ করা যেতে পারে, নাকি সব সময়ে (যেমন জাভাগুলির পূর্ববর্তী সংস্করণের কোনও প্রকৃত মাল্টিথ্রিডিং ছিল না; সম্ভবত কিছু ছোট ভিএমও তা করতে পারে না)। ভিএম-তে জাভা রানগুলি ভুলে যান না, সুতরাং আপনার কোডটি VM / OS / HW অনুসারে এটি ভিন্ন কিছু রূপান্তরিত হবে।




অপেক্ষা এবং ঘুমাতে কাজ করার পরে আমি কিছু পার্থক্য কী নোটগুলি শেষ করেছি, প্রথমে অপেক্ষা করুন () এবং ঘুম () ব্যবহার করে নমুনাটি দেখুন:

উদাহরণ 1 : অপেক্ষা () এবং ঘুম () ব্যবহার করে:

synchronized(HandObject) {
    while(isHandFree() == false) {
        /* Hand is still busy on happy coding or something else, please wait */
        HandObject.wait();
    }
}

/* Get lock ^^, It is my turn, take a cup beer now */
while (beerIsAvailable() == false) {
    /* Beer is still coming, not available, Hand still hold glass to get beer,
       don't release hand to perform other task */
    Thread.sleep(5000);
}

/* Enjoy my beer now ^^ */
drinkBeers();

/* I have drink enough, now hand can continue with other task: continue coding */
setHandFreeState(true);
synchronized(HandObject) {
    HandObject.notifyAll();
}

কিছু কী নোট স্বচ্ছতা যাক:

  1. কল করুন :
    • অপেক্ষা করুন (): HandObject Object ধারণ করে বর্তমান থ্রেডে কল করুন
    • ঘুম (): থ্রেড এক্সিকিউট টাস্কে কল করুন বিয়ার পান (ক্লাস পদ্ধতিটি চলমান চলমান থ্রেডে প্রভাবিত হয়)
  2. সিঙ্ক্রোনাইজড
    • অপেক্ষা করুন (): যখন মাল্টি থ্রেড অ্যাক্সেস সিঙ্ক্রোনাইজ করা হয় তখন একই বস্তু (HandObject) (একই বস্তুতে একাধিক থ্রেড (থ্রেড এক্সিকিউট কোডিং, থ্রেড এক্সিকিউট বিয়ার পেতে) অ্যাক্সেসের প্রয়োজন হলে হ্যান্ডবাইটটি
    • ঘুম (): অপেক্ষারত অবস্থায় অপেক্ষা করার সময় (অপেক্ষা বিয়ার উপলব্ধ)
  3. লক ধরে রাখুন :
    • অপেক্ষা করুন (): অন্যান্য বস্তুর জন্য লকটি কার্যকর করার সুযোগ রয়েছে (HandObject বিনামূল্যে, আপনি অন্য কাজ করতে পারেন)
    • ঘুম (): অন্তত টি বারের জন্য লক রাখুন (বা বাধা না দেওয়া পর্যন্ত) (আমার কাজটি এখনও শেষ না হয়, আমি হোল্ড লক চালিয়ে যাচ্ছি এবং কিছু শর্ত অপেক্ষায় থাকি)
  4. ওয়েক আপ অবস্থা :
    • অপেক্ষা করুন (): কলটি অবহিত না হওয়া পর্যন্ত (), অবহিত করুন অল ()
    • ঘুম (): অন্তত সময় মেয়াদ শেষ না হওয়া পর্যন্ত বা কল বিঘ্নিত
  5. এবং শেষ বিন্দু ব্যবহার করা হয় যখন estani নির্দেশ করে:

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

আমি ভুল যদি আমাকে সঠিক করুন।




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

প্রধান পার্থক্যটি অপেক্ষা করার সময় লক বা মনিটরটি ছেড়ে দেওয়ার জন্য অপেক্ষায় থাকা কোনও লক বা মনিটর মুক্ত করে না। ঘুমানোর সময় এক্স-থ্রেড যোগাযোগের জন্য অপেক্ষা করা হয় যখন নিদ্রা সঞ্চালনের জন্য বিরতি প্রবর্তন করা হয়।

এটি কেবল একটি স্পষ্ট এবং মৌলিক ব্যাখ্যা ছিল, যদি আপনি তার চেয়ে বেশি চান তবে পড়া চালিয়ে যান।

wait() পদ্ধতির থ্রেড অপেক্ষা অবস্থায় চলে যায় এবং এটি স্বয়ংক্রিয়ভাবে ফিরে আসবে না যতক্ষণ না আমরা notify() (অথবা notify() (অথবা notify() notifyAll() যদি আপনার কাছে অপেক্ষা করার অবস্থায় আরও একটি থ্রেড থাকে এবং আপনি সবাইকে জাগাতে চান যারা থ্রেড)। এবং আপনি wait() বা notify() অথবা notify() notifyAll() পদ্ধতিগুলি অ্যাক্সেস করার জন্য সিঙ্ক্রোনাইজড বা বস্তু লক বা ক্লাস লক প্রয়োজন। এবং আরও একটি জিনিস, wait() পদ্ধতিটি আন্তঃ-থ্রেড যোগাযোগের জন্য ব্যবহৃত হয় কারণ যদি একটি থ্রেড অপেক্ষা অবস্থায় যায় তবে আপনাকে সেই থ্রেডটি ঘোরাতে আরেকটি থ্রেড দরকার।

কিন্তু sleep() ক্ষেত্রে sleep() এটি একটি পদ্ধতি যা কয়েক সেকেন্ডের জন্য বা আপনার চাওয়া সময়ের জন্য প্রক্রিয়াটি ধরে রাখার জন্য ব্যবহৃত হয়। কারণ আপনি যে থ্রেডটি ফেরত পেতে কোনও notify() বা notify() notifyAll() পদ্ধতি notifyAll() করার প্রয়োজন নেই। অথবা আপনি যে থ্রেড ফিরে কল অন্য কোন থ্রেড প্রয়োজন হয় না। ব্যবহারকারীর পালনের পরে একটি গেমের মত কিছু সেকেন্ডের পরে আপনি কিছু করতে চান তবে আপনি ব্যবহারকারীকে কম্পিউটারটি না হওয়া পর্যন্ত অপেক্ষা করতে চান তবে আপনি sleep() পদ্ধতিটি উল্লেখ করতে পারেন।

এবং আরও একটি গুরুত্বপূর্ণ পার্থক্য যা সাক্ষাত্কারে প্রায়ই জিজ্ঞাসা করা হয়: sleep() Thread বর্গের অন্তর্গত এবং wait() Object ক্লাসের অন্তর্গত।

এই sleep() এবং wait() মধ্যে সব পার্থক্য।

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

আমি আশা করি এটা তোমাকে সাহায্য করবে।




অপেক্ষা করুন এবং ঘুম দুটি ভিন্ন জিনিস:

  • sleep() থ্রেড নির্দিষ্ট সময়ের জন্য কাজ বন্ধ করে দেয়।
  • wait() থ্রেডটি অবতরণ না হওয়া পর্যন্ত কাজ বন্ধ করে দেয় - অন বিজ্ঞপ্তিটি সাধারণত অন্যান্য থ্রেড দ্বারা সূচিত হয়।



ঘুম () হল একটি পদ্ধতি যা কয়েক সেকেন্ডের জন্য বা আপনার চাওয়া সময়ের জন্য প্রক্রিয়াটি ধরে রাখার জন্য ব্যবহৃত হয় তবে অপেক্ষা করার ক্ষেত্রে () পদ্ধতি থ্রেডটি অপেক্ষা অবস্থায় চলে যায় এবং এটি স্বয়ংক্রিয়ভাবে ফিরে আসবে না যতক্ষণ না আমরা অবহিত () বা notifyAll ()।

প্রধান পার্থক্য হল যে অপেক্ষা () ঘুমের সময় লক বা মনিটরটি ছেড়ে দেয় () অপেক্ষা করার সময় কোনও লক বা মনিটর প্রকাশ করে না। ঘুমানোর সময় আন্তঃ-থ্রেড যোগাযোগের জন্য অপেক্ষা করা হয় যখন ঘুমটি সাধারণত সঞ্চালনের জন্য বিরতি প্রবর্তন করতে ব্যবহৃত হয়।

Thread.sleep () কিছু সময়ের জন্য বর্তমান থ্রেডটিকে "না চালানোর যোগ্য" অবস্থায় প্রেরণ করে। থ্রেড এটি অর্জিত মনিটর রাখে - অর্থাৎ যদি থ্রেড বর্তমানে একটি সিঙ্ক্রোনাইজড ব্লক বা পদ্ধতিতে থাকে তবে অন্য কোন থ্রেড এই ব্লক বা পদ্ধতিতে প্রবেশ করতে পারবে না। যদি অন্য থ্রেড t.interrupt () কে কল করে তবে ঘুমন্ত থ্রেডটি ঘুম থেকে উঠবে। মনে রাখবেন ঘুম একটি স্ট্যাটিক পদ্ধতি, যার মানে এটি সর্বদা বর্তমান থ্রেডকে প্রভাবিত করে (যেটি ঘুম পদ্ধতিটি কার্যকর করছে)। একটি সাধারণ ভুল হল t.sleep () কল যেখানে t একটি ভিন্ন থ্রেড হয়; তবুও, এটি বর্তমান থ্রেড যা ঘুমিয়ে থাকবে, টি থ্রেড নয়।

object.wait () বর্তমান থ্রেডকে "নন রান্নেবল" অবস্থায় ঘুমানো (), কিন্তু একটি মোড়ক দিয়ে প্রেরণ করে। অপেক্ষা একটি বস্তুর উপর বলা হয়, একটি থ্রেড নয়; আমরা এই বস্তুর "লক অবজেক্ট" কল করি। lock.wait () বলা হয়, বর্তমান থ্রেডটি লক অবজেক্টে সিঙ্ক্রোনাইজ করতে হবে; অপেক্ষা করুন () তারপর এই লকটি রিলিজ করে এবং লকের সাথে সংযুক্ত "অপেক্ষা তালিকা" তে থ্রেড যোগ করে। পরে, অন্য থ্রেড একই লক অবজেক্টে সিঙ্ক্রোনাইজ করতে পারে এবং lock.notify () কে কল করতে পারে। এই মূল, অপেক্ষা থ্রেড জেগে ওঠে। মূলত, অপেক্ষা করুন () / অবহিত করুন () ঘুমের মত () / বাধা (), শুধুমাত্র সক্রিয় থ্রেডটিকে ঘুমন্ত থ্রেডে সরাসরি পয়েন্টারের প্রয়োজন নেই, তবে শুধুমাত্র ভাগ করা লক বস্তুতে।

synchronized(LOCK) {   
   Thread.sleep(1000); // LOCK is held
}

synchronized(LOCK) {   
   LOCK.wait(); // LOCK is not held
}

উপরের সব পয়েন্ট শ্রেণীভুক্ত করা যাক:

Call on:

  • অপেক্ষা করুন (): একটি বস্তুর উপর কল করুন; বর্তমান থ্রেড লক বস্তুর উপর সিঙ্ক্রোনাইজ করতে হবে।
  • ঘুম (): একটি থ্রেড উপর কল করুন; সবসময় বর্তমানে থ্রেড নির্বাহ।

Synchronized:

  • অপেক্ষা করুন (): যখন একাধিক থ্রেড সমলয় করা একই বস্তু এক এক একযোগে অ্যাক্সেস।
  • ঘুম (): একাধিক থ্রেড সিঙ্ক্রোনাইজ যখন ঘুমের থ্রেড উপর ঘুমের জন্য অপেক্ষা করুন।

Hold lock:

  • অপেক্ষা করুন (): অন্য বস্তুর জন্য লকটি কার্যকর করার সুযোগটি ছেড়ে দিন।
  • ঘুম (): টাইমআউট নির্দিষ্ট বা কেউ বাধা দেয় যদি অন্তত টি বার জন্য লক রাখা।

Wake-up condition:

  • অপেক্ষা করুন (): কলটি অবহিত না হওয়া পর্যন্ত (), অবহিত করুন অল ()
  • ঘুম (): অন্তত সময় মেয়াদ শেষ না হওয়া পর্যন্ত বা কলটি বাধা দেয় ()।

Usage:

  • ঘুম (): সময়-সিঙ্ক্রোনাইজেশন এবং জন্য;
  • অপেক্ষা করুন (): মাল্টি-থ্রেড-সিঙ্ক্রোনাইজেশনের জন্য।

রেফারেন্স: sleep এবং wait




সহজ কথায়, অপেক্ষার অপেক্ষায় থাকুন অপেক্ষা করুন অন্য কিছু থ্রেড আপনাকে আহ্বান জানাচ্ছে যখন ঘুম কিছু সময়ের জন্য "পরবর্তী বিবৃতিটি কার্যকর করবে না"।

তাছাড়া নিদ্রা থ্রেড ক্লাসে স্ট্যাটিক পদ্ধতি এবং এটি থ্রেডে পরিচালনা করে, যখন অপেক্ষা () বস্তু শ্রেণীতে থাকে এবং একটি বস্তুর উপর ডাকা হয়।

আরেকটি বিন্দু, যখন আপনি কিছু বস্তুর জন্য অপেক্ষা করেন, তখন থ্রেড বস্তুটিকে সিঙ্ক্রোনাইজ করে এবং তারপর অপেক্ষা করে। :)




ঘুম

  • এটা নির্দিষ্ট সময়সীমার জন্য ঘুমানোর বর্তমান এক্সিকিউটিভ থ্রেড কারণ।
  • তার সঠিকতা সিস্টেম টাইমার এবং সময় নির্ধারণকারী উপর নির্ভর করে।
  • এটি অর্জিত মনিটরগুলিকে রাখে, তাই যদি এটি সিঙ্ক্রোনাইজড প্রসঙ্গ থেকে বলা হয় তবে অন্য কোন থ্রেড সেই ব্লক বা পদ্ধতিতে প্রবেশ করতে পারে না।
  • যদি আমরা বাধা () পদ্ধতি কল করি, এটি ঘুমন্ত থ্রেডকে ঘুম থেকে উঠবে।

অপেক্ষা করুন

  • এটি বর্তমান থ্রেডকে অপেক্ষা করতে দেয় যতক্ষণ না অন্য একটি থ্রেড অবহিত () পদ্ধতি বা এই বস্তুর জন্য notifyAll () পদ্ধতি আহ্বান করে।
  • এটি সিঙ্ক্রোনাইজড প্রেক্ষাপটে অর্থাৎ ব্লক বা পদ্ধতি থেকে বলা উচিত। এর অর্থ অপেক্ষা () পদ্ধতিটি বলা হওয়ার আগে, বর্তমান থ্রেডটি সেই বস্তুর উপর লক থাকা আবশ্যক।
  • এটি যে বস্তুটিকে বলা হয় এবং তালিকার তালিকায় যোগ করা হয় তার উপর লক প্রকাশ করে, তাই অন্য থ্রেড বস্তুর উপর লক অর্জন করতে পারে।



ঘুম / বিরতি এবং অপেক্ষা / অবহিত মধ্যে একটি সম্ভাব্য বড় পার্থক্য যে

প্রয়োজন নেই যখন একটি ব্যতিক্রম উৎপন্ন অক্ষম। আপনার যদি উচ্চ হারে একে অপরের সাথে যোগাযোগের থ্রেড থাকে, তবে আপনি যদি সর্বদা বিঘ্নিত কল করে থাকেন তবে এটি CPU এর মোট অপচয়।




পদ্ধতি বিভিন্ন জিনিস জন্য ব্যবহার করা হয়।

Thread.sleep(5000);   // Wait until the time has passed.

Object.wait();        // Wait until some other thread tells me to wake up.

Thread.sleep (n) বাধাগ্রস্ত হতে পারে, কিন্তু Object.wait () অবশ্যই অবহিত করা আবশ্যক । অপেক্ষা করার জন্য সর্বাধিক সময় উল্লেখ করা সম্ভব: Object.wait(5000)সুতরাং wait, er ব্যবহার করা সম্ভব হবে , sleepকিন্তু তারপরে আপনাকে তালা দিয়ে বিরক্ত করতে হবে।

ঘুমের / অপেক্ষার সময় পদ্ধতিগুলির মধ্যে কোনটি cpu ব্যবহার করে না।

পদ্ধতিগুলি অনুরূপ গঠনগুলি ব্যবহার করে, একইভাবে নয়, নেটিভ কোড ব্যবহার করে প্রয়োগ করা হয়।

নিজের জন্য দেখুন: স্থানীয় পদ্ধতির উত্স কোড উপলব্ধ? ফাইল /src/share/vm/prims/jvm.cppশুরু বিন্দু ...




অপেক্ষা করুন () এবং ঘুম () পার্থক্য?

Thread.sleep () তার কাজ সম্পন্ন হলে শুধুমাত্র এটি প্রত্যেকের জন্য লক প্রকাশ। তার কখনও লক মুক্তি না হওয়া পর্যন্ত।

  Sleep() take the key, its never release the key to anyone, when its work completed then only its release then only take the key waiting stage threads.

Object.wait () যখন এটি পর্যায় অপেক্ষা করতে যাচ্ছে, তখন এটি কীটি ছেড়ে দেওয়া হবে এবং তারপরে কয়েক সেকেন্ডের জন্য এটি প্যারামিটারের উপর অপেক্ষা করবে।

উদাহরণ স্বরূপ:

আপনি আপনার ডানদিকে কফি গ্রহণ করেন, আপনি একই হাত থেকে অন্য কাউকে নিতে পারেন, যখন আপনি ঢুকে পড়বেন তখন অন্য বস্তুটি এখানে একই রকম করে নেবেন। এছাড়াও। এই ঘুম হয় () তুমি ঘুমানোর সময় তুমি কোন কাজ করনি, তুমি শুধু ঘুমাচ্ছো ... এখানেও একই।

অপেক্ষা করুন ()। যখন আপনি নিচে রাখা এবং অপেক্ষার সময় অন্য একটি গড় নিতে, যে অপেক্ষা

আপনি প্লেয়ার হিসাবে আপনার সিস্টেমে বা অন্য কোনও প্লেয়ার প্লেয়ার হিসাবে একই সময়ে একাধিক না খেলতে পারেন, এটি এখানে, যখন আপনি বন্ধ করেন এবং অন্য কেউ যে কোনও চলচ্চিত্র বা গানের অর্থ নির্বাচন করেন তবে অপেক্ষা করা হয়




sleep()পদ্ধতিটি বর্তমান থ্রেডকে নির্দিষ্ট সময়ের জন্য রাষ্ট্রটিকে অবরুদ্ধ করার জন্য চলমান অবস্থায় থেকে সরানোর কারণ করে। যদি বর্তমান থ্রেডটিতে কোনও বস্তুর লক থাকে তবে এটি এটি ধরে রাখে, যার মানে হল যে অন্য থ্রেডগুলি সেই বর্গ বস্তুর কোনও সিঙ্ক্রোনাইজড পদ্ধতি কার্যকর করতে পারে না।

wait() পদ্ধতিটি বর্তমান থ্রেডকে নির্দিষ্ট সময়ের জন্য বা নির্দিষ্ট সময়ের জন্য ব্লক অবস্থায় যেতে দেয়, তবে এই ক্ষেত্রে থ্রেড বস্তুর লকটি ছেড়ে দেয় (যার অর্থ অন্যান্য থ্রেডগুলি কলিং বস্তুর কোনও সিঙ্ক্রোনাইজড পদ্ধতি কার্যকর করতে পারে।




ঘুম সম্পর্কে উদাহরণ লক প্রকাশ না এবং অপেক্ষা করে

এখানে দুটি ক্লাস আছে:

  1. প্রধান : প্রধান পদ্ধতি এবং দুটি থ্রেড রয়েছে।
  2. একক এই দুই স্ট্যাটিক পদ্ধতি getInstance () এবং getInstance (বুলিয়ান isWait) সঙ্গে Singleton বর্গ।

    public class Main {
    
    private static Singleton singletonA = null;
    private static Singleton singletonB = null;
    
    public static void main(String[] args) throws InterruptedException {
    
    Thread threadA = new Thread() {
        @Override
        public void run() {
    
            singletonA = Singleton.getInstance(true);
    
        }
    };
    
    Thread threadB = new Thread() {
        @Override
        public void run() {
            singletonB = Singleton.getInstance();
    
            while (singletonA == null) {
                System.out.println("SingletonA still null");
            }
    
            if (singletonA == singletonB) {
                System.out.println("Both singleton are same");
            } else {
                System.out.println("Both singleton are not same");
            }
    
        }
    };
    
    threadA.start();
    threadB.start();
    
     }
    }

এবং

public class Singleton {

    private static Singleton _instance;

    public static Singleton getInstance() {

    if (_instance == null) {
        synchronized (Singleton.class) {
            if (_instance == null)
                _instance = new Singleton();
        }
    }
    return _instance;

}

public static Singleton getInstance(boolean isWait) {

    if (_instance == null) {
        synchronized (Singleton.class) {
            if (_instance == null) {
                if (isWait) {
                    try {
                        // Singleton.class.wait(500);//Using wait
                        Thread.sleep(500);// Using Sleep
                        System.out.println("_instance :"
                                + String.valueOf(_instance));
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                _instance = new Singleton();
            }
        }
    }
    return _instance;

 }
}

এখন এই উদাহরণটি চালান আপনি আউটপুট পাবেন:

_instance :null
Both singleton are same

এখানে থ্রেডএ এবং থ্রেডবি দ্বারা নির্মিত সিঙ্গলটন উদাহরণ একই। এর অর্থ হল থ্রেডবি বাইরে থ্রেড হওয়া অপেক্ষা করছে এটির লকটি ছেড়ে দেয়।

এখন Thread.sleep মন্তব্য করে Singleton.java পরিবর্তন করুন (500); পদ্ধতি এবং uncommenting Singleton.class.wait (500); ।এখানে Singleton.class.wait (500) এর কারণে; পদ্ধতি থ্রেড সমস্ত অ্যাক্টিভ লকগুলি ছেড়ে দেবে এবং "অ রানযোগ্য" অবস্থায় চলে যাবে, থ্রেডবি সিঙ্ক্রোনাইজ ব্লকটিতে প্রবেশ করতে পরিবর্তন পাবে।

এখন আবার রান করুন:

SingletonA still null
SingletonA still null
SingletonA still null
_instance :com.omt.sleepwait.Singleton@10c042ab
SingletonA still null
SingletonA still null
SingletonA still null
Both singleton are not same

এখানে থ্রেডএ এবং থ্রেডবি দ্বারা তৈরি সিঙ্গল্ট ইনস্ট্যান্সগুলি একই নয় কারণ থ্রেডবি সিঙ্ক্রোনাইজড ব্লকটিতে প্রবেশের জন্য পরিবর্তন পেয়েছে এবং 500 মিলিসেকেন্ডের পরে থ্রেড এটির শেষ অবস্থান থেকে শুরু হয়েছে এবং আরও একক্টোন বস্তু তৈরি করেছে।




অ্যারাকাল ডকুমেন্টেশন পৃষ্ঠা থেকে wait() পদ্ধতি Object:

public final void wait()
  1. বর্তমান থ্রেডটি অপেক্ষা করতে পারে যতক্ষণ না অন্য থ্রেড notify()পদ্ধতি বা notifyAll()এই বস্তুর জন্য পদ্ধতি আহ্বান করে । অন্য কথায়, এই পদ্ধতি ঠিক যেমনটি কেবল কলটি সম্পাদন করে ঠিক তেমন আচরণ করে wait(0)
  2. বর্তমান থ্রেড এই বস্তুর মনিটর মালিক থাকা আবশ্যক। থ্রেড এই মনিটারের মালিকানা প্রকাশ করে এবং অন্য থ্রেড জেগে ওঠার জন্য এই বস্তুর মনিটর অপেক্ষা থ্রেডগুলিকে সূচিত না হওয়া পর্যন্ত অপেক্ষা করে
  3. হস্তক্ষেপ এবং জঘন্য wakeups সম্ভব
  4. এই পদ্ধতিটি শুধুমাত্র একটি থ্রেড দ্বারা বলা উচিত যা এই বস্তুর মনিটরটির মালিক

এই পদ্ধতি ছুড়ে

  1. IllegalMonitorStateException - বর্তমান থ্রেড বস্তুর মনিটর মালিক না।

  2. InterruptedException- যদি কোন থ্রেড বর্তমান থ্রেডটি আগে বা যখন বর্তমান থ্রেডটি একটি বিজ্ঞপ্তিটির জন্য অপেক্ষা করছে তখন বাধা দেয়। এই ব্যতিক্রমটি নিক্ষেপ করা হলে বর্তমান থ্রেডের বাধাগ্রস্ত অবস্থাটি সাফ করা হয়।

অলাক্স ডকুমেন্টেশন পৃষ্ঠা থেকে sleep() পদ্ধতির Threadক্লাস:

public static void sleep(long millis)
  1. নির্দিষ্ট সময়সীমার মিলিসেকেন্ডগুলির জন্য বর্তমানে নির্বাহিত থ্রেড ঘুমাতে (সাময়িকভাবে বিঘ্নিত হওয়া) কারণ, সিস্টেম টাইমার এবং সময় নির্ধারণকারীগুলির নির্ভুলতা এবং সঠিকতা সাপেক্ষে।
  2. থ্রেড কোনো মনিটর মালিকানা হারান না।

এই পদ্ধতি ছুড়ে ফেলে:

  1. IllegalArgumentException - মিলিস মান নেতিবাচক হয়

  2. InterruptedException- যদি কোন থ্রেড বর্তমান থ্রেড বাধা দেয়। এই ব্যতিক্রমটি নিক্ষেপ করা হলে বর্তমান থ্রেডের বাধাগ্রস্ত অবস্থাটি সাফ করা হয়।

অন্যান্য কী পার্থক্য:

wait()স্ট্যাটিক পদ্ধতি sleep()(ক্লাস পদ্ধতি) অসদৃশ একটি অ স্ট্যাটিক পদ্ধতি (উদাহরণ পদ্ধতি)।




টাইমআউট মানের সাথে অপেক্ষা করুন সময়সীমার মূল্যের উপর জাগিয়ে উঠতে পারে অথবা যা আগেরটি (বা পাশাপাশি বিঘ্নিত) হতে পারে তাও জানাতে পারে, তবে, ঘুমের সময়সীমার সময় ঘুম থেকে জেগে ওঠা বা যা আগে হোক তা বিঘ্নিত হয়। অপেক্ষা করুন () কোন সময়সীমার মান সহ বিজ্ঞাপিত না হওয়া পর্যন্ত বা অবরুদ্ধ হওয়া পর্যন্ত অপেক্ষা করবে






Related