ওয়েট এবং ব্লকড থ্রেডের রাজ্যের মধ্যে পার্থক্য


101

থ্রেড স্টেট ওয়েট এবং থ্রেড স্টেট ব্লকডের মধ্যে পার্থক্য কী?

Thread.State ডকুমেন্টেশন :

অবরুদ্ধ
একটি থ্রেড যা মনিটরের লকের জন্য অপেক্ষা করা অবরুদ্ধ this এই অবস্থায় রয়েছে।

অপেক্ষা করা হচ্ছে
একটি থ্রেড যে অন্য থ্রেড জন্য অনির্দিষ্টকালের জন্য অপেক্ষা করছে একটি নির্দিষ্ট কর্ম সঞ্চালন করার জন্য এই অবস্থায় রয়েছে

পার্থক্যটি আমার কাছে ব্যাখ্যা করে না


এই থ্রেড চেক উত্তর stackoverflow.com/questions/2534147/java-thread-wait-blocked এছাড়াও এই লিঙ্কে আরও ব্যাখ্যা প্রদান করতে পারে geekexplains.blogspot.cz/2008/07/...
আব্দুল

@ আবদুল গিকেক্সপ্ল্লেইনস লিঙ্কটি বলেছে যে অবজেক্ট.ওয়েট () কে ফোন করে কোনও থ্রেড একটি ব্লকড অবস্থায় যেতে পারে এটি সঠিক নয় কি?
পাঁচ

ওরাকল ডক্স অনুযায়ী ডকসস.অরাকল.com / জাভ্যাস / / / ডকস / এপি / জাভা / আংল্যাঙ্গ : একটি থ্রেড নিম্নলিখিত পদ্ধতিগুলির মধ্যে একটিকে কল করার কারণে অপেক্ষার স্থানে রয়েছে: অবসর ছাড়াই অবজেক্ট.ওয়েট, থ্রেড.জাইন কোনও সময়সীমা ছাড়াই, লকসপোর্ট.পার্ক
আব্দুল

রেকর্ডটির জন্য, আমি মনে করি @ ফ্ল্যাভিওর উত্তরটি আপনি যদি পরিবর্তন বিবেচনা করতে পারেন তবে অঙ্কিতের চেয়ে কিছুটা ভাল।
গ্রে

উত্তর:


80

একটি থ্রেড একবার wait()অবজেক্টে ডাকার পরে অপেক্ষার স্থানে যায় । একে ওয়েটিং স্টেট বলে। কোনও থ্রেড অপেক্ষার স্থানে পৌঁছে গেলে এটি অন্য কিছু থ্রেড কল notify()বা notifyAll()অবজেক্ট পর্যন্ত অপেক্ষা করতে হবে ।

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

অন্য থ্রেডগুলি ছেড়ে যাওয়ার পরে এবং এই থ্রেডের সুযোগটি হয়ে গেলে, এটি জেভিএম থ্রেডিং মেকানিজমের উপর ভিত্তি করে উপযুক্ত পিক আপ কাজের যোগ্য হয়ে ওঠে এবং চালিত অবস্থায় চালিত হয় after


2
আপনি এটি আরও ভাল ব্যাখ্যা করেছেন কারণ আপনি যে দুটি ধারাবাহিকভাবে একটি থ্রেড পৌঁছেছেন সেগুলির ক্রমটি ব্যাখ্যা করেছিলেন যা দুটি রাজ্যের বিচ্ছিন্নতার প্রতিটি ব্যাখ্যা দেওয়ার চেয়ে পরিষ্কার করে তোলে (যা "পাঁচেরও বেশি" জবাব দিয়েছিলেন
কুমার মনীষ

7
: সব যারা, যারা ভাবছি কেন অধিকাংশ (? সব) রাষ্ট্র ডায়াগ্রামে ওয়েব দাবি পাওয়া যায়, যে পরিবর্তে runnable অবরুদ্ধ মধ্যে অবহিত () / notifyAll () ফলাফলের জন্য stackoverflow.com/questions/28378592/...
Niklas পিটার

ধরুন এখানে কেবল একটি থ্রেড রয়েছে এবং কিছু সময় মিলিতে অপেক্ষা করেছিলেন; এখন কি অপেক্ষা করা অবস্থা থেকে সরাসরি কোনও থ্রেড চলমান অবস্থায় যেতে পারে? যেহেতু কেবলমাত্র একক থ্রেডের পরে অন্য কোনও থ্রেড লক নেয় না?
কানগাভেলু সুগুমার

একটি অপেক্ষা (সময়) পদ্ধতি রয়েছে যা সময় শেষ হয়ে যাওয়ার পরে চালানোযোগ্য অবস্থায় ফিরে আসবে। তবে যদি কোনও সময় নির্দিষ্ট না করা থাকে, তবে অন্যান্য থ্রেডটি সূচিত না হওয়া বা থ্রেডটি বাধা দেওয়া পর্যন্ত এটি অপেক্ষা করবে।
অঙ্কিত বানসাল

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

90

পার্থক্য তুলনামূলকভাবে সহজ।

ইন BLOCKEDরাষ্ট্র, একটি থ্রেড একটি প্রবেশ করতে হয় synchronizedব্লক, কিন্তু অন্য থ্রেড বর্তমানে ভিতরে চলমান synchronizedএকই বস্তুর উপর ব্লক। প্রথম থ্রেডটি তারপরে দ্বিতীয় থ্রেডটির ব্লক থেকে বেরিয়ে যাওয়ার জন্য অপেক্ষা করতে হবে।

ইন WAITINGরাষ্ট্র, একটি থ্রেড অন্য থ্রেড থেকে একটি সংকেত জন্য অপেক্ষা করছে। এটি সাধারণত কল করে Object.wait()বা হয় Thread.join()। অন্য থ্রেড কল না হওয়া Object.notify()বা মারা না যাওয়া পর্যন্ত থ্রেডটি এই অবস্থায় থাকবে ।


2
এটি কি ঠিক বলা যায় যে কেবল একটি থ্রেড নিজেই এটি অপেক্ষায় যেতে পারে? থ্রেড-বি কি কখনও থ্রেড-এ ওয়েট স্টেটে যেতে পারে?
পাঁচ

1
আপনি খুব কমই Object.wait()সরাসরি ব্যবহার করেন তবে আপনি WAITINGআরও উচ্চ-স্তরের সম্মতিমূলক কন্সট্রাক্টস যেমন- তালা, ব্লক করা সারি ইত্যাদি ব্যবহার করে ... রাজ্যে শেষ হয়ে যাবেন, যখনই দুটি থ্রেড সমন্বয় করতে হবে।
ফ্ল্যাভিও

1
ব্যক্তিগত অভিজ্ঞতা থেকে, আইও (যেমন সকেট থেকে পড়া) এর জন্য অপেক্ষা করা থ্রেডগুলি RUNNINGঅবস্থায় রয়েছে।
ফ্ল্যাভিও

4
জাভা 8 ডকটি Thread.Stateবলেছেন, "... এই রাজ্যগুলি ভার্চুয়াল মেশিন স্টেটস যা কোনও অপারেটিং সিস্টেম থ্রেডের রাজ্যগুলিকে প্রতিফলিত করে না" " অন্য কথায়, জেভিএম কোনও থ্রেড যা জাভা কোড চলমান, একটি থ্রেড যা সিস্টেম কল ফিরে আসার অপেক্ষায় আছে, বা একটি থ্রেড যা সময়ের স্লাইসের জন্য অপেক্ষা করছে তার মধ্যে পার্থক্য সম্পর্কে চিন্তা করে না। এগুলি সমস্তই RUNNABLEজেভিএমের সাথে সম্পর্কিত।
সলোমন

3
এটি যুক্ত করে সুন্দর হতে পারে যে কোনও থ্রেড যখন WAITINGরাজ্য থেকে সরে যায় তখন অবশ্যই প্রথমে BLOCKEDরাজ্যে যেতে হবে যতক্ষণ না এটি যে অবজেক্টটির সাথে অপেক্ষা করছিল তার সাথে যুক্ত লকটি অর্জন করতে পারে।
ধূসর

21

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

কোনও থ্রেড ওয়েট স্টেটে আসার পরে এটি সিস্টেমে যে চাপ দেয় তা হ্রাস করা যায়, এবং শিডিয়ুলারকে এটি নিয়ে চিন্তা করতে হবে না। এটি কোনও বিজ্ঞপ্তি না পাওয়া পর্যন্ত এটি সুপ্ত হয়। এটি কোনও ওএস থ্রেডকে দখল করে রেখেছে এ বাদে এটি পুরোপুরি খেলার বাইরে থাকে।

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

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


এটি কি কারণ মনিটর অবজেক্টে নোটিফাই () কল করা কিছু অন্যান্য থ্রেডের দায়িত্ব?
বেরিম্বোলো

@ বেরিম্বোলো: আপনি কী জিজ্ঞাসা করছেন তা আমি বুঝতে পারি না
নাথান হিউজ

এটি কেন ওয়েটিং থ্রেডের জন্য শিডিয়ুলারের উদ্বেগের প্রয়োজন তা নয় to আমি ভাবছিলাম যে এটি ছিল কারণ অন্য থ্রেডটি অপেক্ষা করার পরে বিজ্ঞপ্তি কল করার জন্য দায়বদ্ধ হবে।
বেরিম্বোলো

@ বারিম্বোলো: অপেক্ষমান থ্রেড অবশেষে একটি বিজ্ঞপ্তির দ্বারা জাগ্রত হয়। সময়সূচী সিদ্ধান্ত নেবে যে অপেক্ষার থ্রেডটি অবহিত হবে।
নাথান হিউজেস

কিছু গণনা করা হয়, আপনি স্পিন-লক বলছেন, ব্লকড ডোজের অর্থ এটি স্পিন-লক নয়
ফ্রাঙ্ক জাং

16

থ্রেড ডাম্পগুলি ব্যাখ্যা করার জন্য সরলীকৃত দৃষ্টিকোণ:

  • WAIT - আমি, কিছু কাজ দেওয়া হবে তাই আমি এখন অলস ঠিক আছি অপেক্ষায় আছি।
  • অবরুদ্ধ - আমি কাজ শেষ করার চেষ্টায় ব্যস্ত তবে অন্য একটি থ্রেড আমার পথে দাঁড়িয়ে আছে, তাই আমি এখনই অলস।
  • রুননেবল ... (নেটিভ পদ্ধতি) - আমি আরএনআনকে কিছু নেটিভ কোড (যা এখনও শেষ হয়নি) ফোন করেছিলাম, যতক্ষণ না জেভিএম সম্পর্কিত, আপনি রেনএবল এবং এটি আর কোনও তথ্য দিতে পারে না। একটি সাধারণ উদাহরণ হ'ল সিটে কোডেড একটি দেশীয় সকেট শ্রোতা পদ্ধতি যা আসলে কোনও ট্র্যাফিক আসার অপেক্ষায় থাকে, তাই আমি এখনই নিষ্ক্রিয়। এই পরিস্থিতিতে, এটি একটি বিশেষ ধরণের ওয়েট হিসাবে দেখা যেতে পারে কারণ আমরা আসলে চালাচ্ছি না (কোনও সিপিইউ বার্ন নেই) তবে জাভা থ্রেড ডাম্প দেখার চেয়ে আপনাকে একটি ওএস থ্রেড ডাম্প ব্যবহার করতে হবে।

1
আমি আপনার ব্যাখ্যা পছন্দ। ঠিক এখনই থ্রেড ডাম্প বিশ্লেষণে আমি যা করার চেষ্টা করছি :)
শ্রীধর সারনোবাত

@ মুহাম্মাদগেলবানা হ্যাঁ, আপনি ঠিক বলেছেন, আমি মন্তব্য মুছে ফেলেছি।
এরিক ওয়াং

1
আপনার RUNNABLEঠিক ঠিক নেই। এটি জাভা রান কাতারে থাকতে পারে তবে কার্যকর হচ্ছে না বা এটি জাভা কোড সম্পাদন করতে পারে। এটি আদি-জমি থেকে কল করতে হবে না।
গ্রে

1

অবরুদ্ধ- আপনার থ্রেড থ্রেড লাইফ চক্রের চলনযোগ্য অবস্থায় রয়েছে এবং অবজেক্ট লকটি পাওয়ার চেষ্টা করছে। অপেক্ষা করুন- আপনার থ্রেডটি থ্রেডের জীবনচক্রের অপেক্ষার স্থানে রয়েছে এবং সূচিত প্রবাহে সূচিত হওয়ার জন্য বিজ্ঞপ্তি সংকেতের জন্য অপেক্ষা করছে।


-1

এই উদাহরণটি দেখুন:

থ্রেড রাজ্যের প্রদর্শন।

/*NEW- thread object created, but not started.
RUNNABLE- thread is executing.
BLOCKED- waiting for monitor after calling wait() method.
WAITING- when wait() if called & waiting for notify() to be called.
  Also when join() is called.
TIMED_WAITING- when below methods are called:
 Thread.sleep
 Object.wait with timeout
 Thread.join with timeout
TERMINATED- thread returned from run() method.*/
public class ThreadBlockingState{

public static void main(String[] args) throws InterruptedException {
    Object obj= new Object();
    Object obj2 = new Object();
    Thread3 t3 = new Thread3(obj,obj2);
    Thread.sleep(1000);
    System.out.println("nm:"+t3.getName()+",state:"+t3.getState().toString()+
            ",when Wait() is called & waiting for notify() to be called.");
    Thread4 t4 = new Thread4(obj,obj2);
    Thread.sleep(3000);
    System.out.println("nm:"+t3.getName()+",state:"+t3.getState().toString()+",After calling Wait() & waiting for monitor of obj2.");
    System.out.println("nm:"+t4.getName()+",state:"+t4.getState().toString()+",when sleep() is called.");
}

}
class Thread3 extends Thread{
Object obj,obj2;
int cnt;
Thread3(Object obj,Object obj2){
    this.obj = obj;
    this.obj2 = obj2;
    this.start();
}

@Override
public void run() {
    super.run();
    synchronized (obj) {
        try {
            System.out.println("nm:"+this.getName()+",state:"+this.getState().toString()+",Before Wait().");
            obj.wait();             
            System.out.println("nm:"+this.getName()+",state:"+this.getState().toString()+",After Wait().");
            synchronized (obj2) {
                cnt++;
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
}
class Thread4 extends Thread{
Object obj,obj2;
Thread4(Object obj,Object obj2){
    this.obj = obj;
    this.obj2 = obj2;
    this.start();
}

@Override
public void run() {
    super.run();
    synchronized (obj) {
        System.out.println("nm:"+this.getName()+",state:"+this.getState().toString()+",Before notify().");
        obj.notify();
        System.out.println("nm:"+this.getName()+",state:"+this.getState().toString()+",After notify().");
    }
    synchronized (obj2) {
        try {
            Thread.sleep(15000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
}

কোডটির জন্য ধন্যবাদ তবে আমি বরং আপনার কাছে একটি পাঠ্য উত্তর হবে এবং তারপরে একটি ছোট কোড ব্লক দেখানো হবে ।
গ্রে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.