2013-11-14 12 views
6

मेरे पास एक बहुत ही बुनियादी सवाल है। यदि आईओ ऑपरेशन में कोई धागा व्यस्त है तो इसे एक रनिंग राज्य में क्यों नहीं माना जाता है? यदि आईओ ऑपरेशन में काफी समय लग रहा है तो इसका मतलब है कि धागा अपना काम कर रहा है। जब वास्तव में यह काम कर रहा है तो थ्रेड को ब्लॉक्ड कहा जा सकता है?जावा थ्रेड - अवरुद्ध स्थिति

+0

जांच इस के साथ निम्न कोड चलाते हैं http://stackoverflow.com/questions/13596997/why-is-the- cpu-not-required-to-service-io-request – Changgeng

+0

यह कोई काम नहीं कर रहा है, यह कोर पर नहीं चल रहा है, यह कोई CPU का उपयोग नहीं कर रहा है, इसलिए इसे 'रनिंग' पर विचार करना बिल्कुल उचित नहीं है! –

+0

शायद आप थ्रेड संदर्भ में "अवरुद्ध" शब्द को "अवरुद्ध I/O ऑपरेशन" के साथ भ्रमित करते हैं जिसका अर्थ कुछ अलग है। – BartoszKP

उत्तर

4

मुझे नहीं पता कि आप कहां पढ़ते हैं कि आईओ करते समय एक धागा ब्लॉक किए गए राज्य में है। BLOCKED state documentation कहता है:

एक थ्रेड के लिए थ्रेड स्थिति मॉनिटर लॉक के लिए प्रतीक्षा अवरुद्ध है। अवरुद्ध स्थिति में एक थ्रेड एक मॉनिटर लॉक को सिंक्रनाइज़ किए गए ब्लॉक/विधि में प्रवेश करने के लिए इंतजार कर रहा है या ऑब्जेक्ट.वेट को कॉल करने के बाद सिंक्रनाइज़ ब्लॉक/विधि को पुन: प्रस्तुत करता है।

तो, नहीं, आईओ करने के दौरान एक थ्रेड अवरुद्ध स्थिति में नहीं है (जब तक कि पाठ्यक्रम को पढ़ने या लिखने के लिए इसे ऑब्जेक्ट के मॉनीटर पर इंतजार न किया जाए)।

4

आप एक धागा

public class Main { 
    public static void main(String[] args) throws InterruptedException { 
     final Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       // blocking read 
       try { 
        System.in.read(); 
       } catch (IOException e) { 
        throw new AssertionError(e); 
       } 
      } 
     }); 
     thread.start(); 
     for(int i=0;i<3;i++) { 
      System.out.println("Thread status: "+thread.getState()); 
      Thread.sleep(200); 
     } 
     System.exit(0); 
    } 
} 

प्रिंट आईओ पर अवरुद्ध

Thread status: RUNNABLE 
Thread status: RUNNABLE 
Thread status: RUNNABLE 
+0

तो, IO को अवरुद्ध करने पर एक थ्रेड स्टेट 'रननाबल' होना कुछ भी नहीं है, लेकिन सीपीयू टाइम स्लाइस पर कब्जा कर रहा है, आईओ प्रतिक्रिया पर इंतजार कर कुछ भी नहीं कर रहा है। यही है ना – overexchange

+0

@ threadxchange जब कोई थ्रेड अवरुद्ध हो रहा है, तो यह CPU का उपयोग नहीं करता है (इस मोड को दर्ज करने और बाहर निकलने के अलावा) भ्रम इस तथ्य के कारण है कि JVM को पता नहीं है कि अवरोधक सिस्टम कॉल कब किया जाता है क्योंकि ओएस इसे तय करता है । –

+0

आवंटित समय स्लाइस के बावजूद, आईओ को अवरुद्ध करने पर धागा, उस समय स्लाइस के लिए सीपीयू की आवश्यकता नहीं है, जिसे समझा जाता है, लेकिन उस समय के टुकड़े के लिए कोई अन्य धागा उस CPU का उपयोग नहीं कर रहा है। यही है ना – overexchange

संबंधित मुद्दे