Java.lang.Thread.State समझना: WAITING (पार्किंग)


90

सबसे पहले, वास्तव में गूंगा सवाल, मैं बस सोच रहा था कि प्रतीक्षा 'पार्किंग' का क्या मतलब है? क्या धागा पार्क होने की प्रतीक्षा कर रहा है या यह सिर्फ पार्क किया गया है और इसलिए प्रतीक्षा की स्थिति में है? और जब वह पार्किंग होती है, तो कितना सीपीयू / मेमोरी रिसोर्स लिया जाता है? एक धागा पार्किंग का उद्देश्य क्या है?

दूसरा, जावा थ्रेड एपीआई में पार्क विधि को देखकर

जब तक परमिट उपलब्ध न हो, थ्रेड शेड्यूलिंग उद्देश्यों के लिए वर्तमान थ्रेड को अक्षम करता है।

यदि परमिट उपलब्ध है तो इसका उपभोग किया जाता है और कॉल तुरंत वापस आ जाती है; अन्यथा थ्रेड शेड्यूलिंग उद्देश्यों के लिए वर्तमान थ्रेड अक्षम हो जाता है और तीन चीजों में से एक होने तक निष्क्रिय रहता है ....।

अंग्रेजी मेरी प्राथमिक भाषा नहीं है, इसलिए मुझे यह समझने में कुछ मुश्किलें हैं कि, मैंने 'परमिट' को 'थ्रेड को पार्क करने की अनुमति' के रूप में लिया था, इसलिए निम्नलिखित प्रश्न:

  • उसका क्या अर्थ है, 'परमिट' क्या है, और कौन और कैसे उन परमिट की जाँच कर रहा है?
  • इसका क्या अर्थ है: 'यदि परमिट उपलब्ध है तो इसका उपभोग किया जाता है', क्या यह 'पार्क' हो रहा है?
  • निम्नलिखित, यदि दूसरा बिंदु सत्य है, तो 'पार्किंग' और 'झूठ निष्क्रिय' में क्या अंतर है? यदि मेरे पास अनुमति है तो मैं इसे हमेशा के लिए पार्क कर सकता हूं और यदि नहीं, तो मैं इसे 'निष्क्रिय' बना सकता हूं?

धन्यवाद

जवाबों:


36

परमिट का मतलब निष्पादन जारी रखने की अनुमति है। पार्किंग का मतलब है कि जब तक परमिट उपलब्ध नहीं हो जाता है, तब तक निष्पादन पर रोक है।

Semaphoreपरमिट के विपरीत , LockSupportथ्रेड्स के साथ परमिट जुड़े होते हैं (यानी परमिट एक विशेष धागे को दिया जाता है) और जमा नहीं होता है (यानी प्रति धागा केवल एक परमिट हो सकता है, जब धागा परमिट का उपभोग करता है, तो यह गायब हो जाता है)।

आप कॉल करके थ्रेड को परमिट दे सकते हैं unpark()। एक थ्रेड इसके निष्पादन को निलंबित कर सकता है जब तक कि परमिट उपलब्ध नहीं है (या थ्रेड बाधित है, या समय समाप्त हो गया है, आदि) कॉल करके park()। जब परमिट उपलब्ध होता है, तो पार्क किया गया धागा इसका सेवन करता है और एक park()विधि से बाहर निकलता है ।


2
इसलिए, यह सुनिश्चित करें कि यदि थ्रेड A कॉल थ्रेड बी के लिए 'थ्रेड' है, लेकिन परमिट उपलब्ध है, जो 'बी पार्क नहीं किया जा सकता' है, तो ए जस्ट रिटर्न और बी द्वारा किए गए कॉल को पार्क नहीं किया गया है। अन्यथा जब कोई परमिट नहीं मिलता है, तो बी को मानना ​​पड़ता है। तो, क्या प्रतीक्षा (पार्किंग) का अर्थ है "ए मुझे पार्किंग करने की कोशिश कर रहा है क्योंकि मेरे पास परमिट नहीं है लेकिन मैं अभी ऐसा नहीं कर सकता हूं इसलिए मैं ए को भी रोक रहा हूं"? इस लंबे वाक्य के लिए क्षमा करें। मुझे लगता है कि यह प्रतीक्षा काफी संसाधन खपत है। मैं अभी भी सोच रहा हूं कि पूरे परमिट वाली चीज़ का प्रबंधन कौन कर रहा है। कौन / क्या तय कर रहा है कि कुछ धागे के पास परमिट है, जबकि अन्य नहीं।
लियोनार्डो

2
@ लियोनार्डो: एक धागा केवल खुद को पार्क कर सकता है, अन्य धागे को पार्क करने का कोई तरीका नहीं है। तो, कॉलिंग का park()अर्थ है "मैं अपने निष्पादन को निलंबित करना चाहता हूं जब तक कि कोई अन्य धागा मुझे कॉल करके परमिट नहीं देता unpark()"।
axtavt

इसलिए एक धागा अन्य धागों को पार्क नहीं कर सकता है, लेकिन अन्य धागों से तैयार नहीं किया जा सकता है। क्या वो सही है ? तो, वह पार्किंग कब होती है? हो सकता है कि किसी सूत्र के पास इस समय कोई काम नहीं है, और यह उसके परमिट पर लगातार देखने से यह जांचने का तरीका है? उदाहरण के लिए डेमन थ्रेड के लिए यह अच्छी तरह से उपयुक्त होगा।
लियोनार्डो

इसके अलावा, WAITING (पार्किंग) का अर्थ है कि यह पार्क किए जाने की प्रतीक्षा कर रहा है, या पार्क होने के बाद प्रतीक्षा की स्थिति में है? क्षमा करें, मुझे पता है कि यह एक गूंगा प्रश्न है :-)
लियोनार्डो

3
@ लियोनार्डो: इसका मतलब है पार्क किए जाने के बाद एक प्रतीक्षा राज्य।
axtavt

11

जावा थ्रेड स्टेट डॉक्यूमेंटेशन के अनुसार , एक थ्रेड तीन कारणों से WAITING स्थिति में जा सकता है:

  1. Object.wait बिना किसी टाइमआउट के
  2. कोई टाइमआउट के साथ
  3. LockSupport.park

जब आप किसी थ्रेड पर पार्क विधि कहते हैं, तो यह थ्रेड शेड्यूलिंग उद्देश्यों के लिए थ्रेड को निष्क्रिय कर देता है जब तक कि परमिट उपलब्ध न हो। आप दिए गए धागे के लिए परमिट उपलब्ध कराने के लिए अनपार्क विधि को कॉल कर सकते हैं, अगर यह पहले से उपलब्ध नहीं था।

इसलिए, जब आपका थ्रेड LockSupport.park द्वारा WAITING मोड में होता है, तो यह आपको WAITING (पार्किंग) के रूप में दिखाएगा।

कृपया ध्यान दें कि, आप केवल वर्तमान थ्रेड पर पार्क कॉल कर सकते हैं। निर्माता-उपभोक्ता डिजाइन पैटर्न को लागू करने के लिए यह बहुत सहायक तंत्र है।


3

वर्ग विवरण से ( लॉकसुपोर्ट जावाडॉक के शीर्ष पर ) जहां यह परमिट का वर्णन करता है:

यह वर्ग प्रत्येक धागे के साथ जुड़ता है जो इसका उपयोग करता है, एक परमिट (सेमाफोर वर्ग के अर्थ में)। यदि परमिट उपलब्ध है, तो इस प्रक्रिया में [परमिट] का उपभोग करते हुए पार्क में कॉल तुरंत वापस आ जाएगी ; अन्यथा [कॉल टू पार्क] ब्लॉक हो सकता है। अनपार्क के लिए एक कॉल परमिट को उपलब्ध कराती है, अगर यह पहले से उपलब्ध नहीं था। (हालांकि सेमाफोरस के विपरीत, परमिट जमा नहीं होते हैं। ज्यादातर एक पर है।)

(मैंने गैर-अंग्रेज़ी बोलने वालों के लिए पढ़ना आसान बनाने के लिए [पाठ] का विस्तार किया ।)

उम्मीद है कि गहरी समझ वाला कोई व्यक्ति इस बारे में विस्तार से बता सकता है। देखें axtavt का जवाब

अंतिम नोट के रूप में, जावदोक का एक अंतिम उद्धरण:

इन विधियों को उच्च-स्तरीय सिंक्रनाइज़ेशन उपयोगिताओं को बनाने के लिए उपकरण के रूप में उपयोग करने के लिए डिज़ाइन किया गया है, और अधिकांश संगामिति नियंत्रण अनुप्रयोगों के लिए स्वयं उपयोगी नहीं हैं।


3

इस हिस्से ने मुझे इस सवाल का फिर से जिक्र किया कि मैं प्रलेखन पढ़ते समय आसपास नहीं पहुंच सकता था, यह था:

यदि परमिट उपलब्ध है तो इसका उपभोग किया जाता है और कॉल तुरंत वापस आ जाती है ...

तो जब परमिट "उपलब्ध" है, तो इसे कौन और कैसे उपलब्ध करता है, ताकि यह तुरंत भस्म हो सके? यह पता लगाने के लिए किसी तरह तुच्छ था:

public static void main(String[] args) {

    Thread parkingThread = new Thread(() -> {
        System.out.println("Will go to sleep...");
        sleepTwoSeconds();
        System.out.println("Parking...");
        // this call will return immediately since we have called  LockSupport::unpark
        // before this method is getting called, making the permit available
        LockSupport.park();
        System.out.println("After parking...");
    });

    parkingThread.start();

    // hopefully this 1 second is enough for "parkingThread" to start
    // _before_ we call un-park
    sleepOneSecond();
    System.out.println("Un-parking...");
    // making the permit available while the thread is running and has not yet
    // taken this permit, thus "LockSupport.park" will return immediately
    LockSupport.unpark(parkingThread);

}

private static void sleepTwoSeconds() {
    try {
        Thread.sleep(1000 * 2);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

private static void sleepOneSecond() {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}    

कोड खुद के लिए बोलता है, threadचल रहा है, लेकिन अभी तक नहीं बुलाया गया है LockSupport.park, जबकि कुछ अन्य धागा LockSupport.unparkइस पर कॉल करते हैं - इस प्रकार परमिट उपलब्ध करवाते हैं। उसके बाद हम कॉल करते हैं LockSupport.parkऔर परमिट मिलने के तुरंत बाद वापस लौट जाते हैं।

एक बार जब आप इसके बारे में सोचते हैं, तो यह थोड़ा खतरनाक होता है, यदि आप अपने थ्रेड्स को कुछ कोड पर नियंत्रित LockSupport.unparkकरते हैं parkजिन्हें आप नियंत्रित नहीं करते हैं और उस कोड को कॉल करते हैं जब आप उसके बाद - यह काम नहीं कर सकता है।


बहुत अच्छा बिंदु, मैंने सोचा होगा कि एक परमिट देने वाली गतिविधि - यानी अनपार्क () को कॉल करना केवल तभी प्रासंगिक है जब एक थ्रेड को पार्क किया जा रहा हो।
अल्फ्रेड जिओ

@AlfredXiao ने सहमति व्यक्त की, यह कुछ ऐसा है जिसने मुझे भी आश्चर्यचकित किया है, लेकिन यह समझ में आता है, मुझे लगता है।
यूजीन

1

जैसा कि मैं इसे समझता हूं, "परमिट" केवल एक ऑब्जेक्ट है जो यह दर्शाता है कि क्या कोई थ्रेड "अनपेक्षित" हो सकता है या नहीं। और यह स्वयं थ्रेड द्वारा जाँच की जाती है (या जब आप थ्रेड को पार्क करने की कोशिश करते हैं तो) "उपभोग किया जाता है" चीज़, मुझे समझ में आता है कि परमिट भंग हो गया है और थ्रेड अक्षम नहीं है।

मुझे लगता है कि आपको मल्टीथ्रेडिंग के बारे में थोड़ा और सीखना चाहिए .. इसे "अनुमति" नामक वस्तुओं के साथ एक डिस्पेंसर के रूप में सोचें। आप थ्रेड को पार्क करने के लिए कहते हैं, और थ्रेड डिस्पेंसर की जांच करते हैं, अगर कोई "परमिट" है, तो थ्रेड इसे ले जाता है और छोड़ देता है (पार्क के बिना)। यदि डिस्पेंसर में कोई "परमिट" नहीं है, तो थ्रेड पार्क किया जाता है जब तक कि "परमिट" उपलब्ध न हो (और आप डिस्पेंसर में "परमिट" डाल सकते हैं unpark

सीपीयू / मेमोरी उपयोग के लिए, मुझे लगता है कि ओएस आदि पर निर्भर करता है ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.