2010-05-05 14 views
7

मैं के रूप में यहाँ खाका खींचा एक HTTP अनुरोध करना और फिर प्रतिक्रिया प्राप्त करना चाहते हैं:जावा BufferedReader रीडलाइन अवरुद्ध?

URLConnection c = new URL("http://foo.com").openConnection(); 
c.setDoOutput(true); 

/* write an http request here using a new OutputStreamWriter(c.getOutputStream) */ 

BufferedReader reader = new BufferedReader(new InputStreamReader(c.getInputStream)); 
reader.readLine(); 

लेकिन मेरे सवाल है, अनुरोध मैं भेज एक लंबे समय से पहले ही प्रतिक्रिया प्राप्त हुई है लगता है, क्या कॉल में क्या होता है पाठक.readLine() ऊपर? क्या यह प्रक्रिया सीपीयू पर चलने/चलाने योग्य रहेगी या क्या इसे सीपीयू से बाहर ले जाया जाएगा और जब आईओ पढ़ा जाए तो फिर से उठने के लिए अधिसूचित किया जाएगा?

यदि यह सीपीयू पर रहता है, तो इसे निकालने के लिए क्या किया जा सकता है और बाद में अधिसूचित किया जा सकता है?

+6

क्या इनमें से कोई भी प्रतिक्रिया आपके प्रश्न को पर्याप्त रूप से समझाती है? यदि ऐसा है, तो आपको शायद अपने स्वीकृत उत्तर के रूप में चिह्नित करना चाहिए। यदि नहीं, तो अभी भी अस्पष्ट होने के लिए अपने प्रश्न को संपादित करें। – jasonmp85

उत्तर

-3

एक अच्छे ओएस में एक शेड्यूलर होगा जो प्रक्रिया को अवरुद्ध या समान स्थिति में रखेगा, और कोई भी कार्य स्विच अवरुद्ध प्रक्रिया पर स्विच नहीं करेगा।

उदाहरण के लिए, विंडोज़ में निष्क्रिय प्रक्रिया तब चलती है जब कोई प्रक्रिया चलाने के लिए तैयार नहीं होती है (सोना, अवरुद्ध, इत्यादि)।

21

दूसरों ने जो कहा है वह सही है। Java.io में जावा की "पुरानी I/O" लाइब्रेरी में अवरुद्ध कॉल शामिल हैं। लेकिन वे इंतजार में व्यस्त नहीं हैं। वे I/O पर अवरुद्ध कर रहे हैं और कर्नेल एक बार फिर I/O उपलब्ध होने पर उन्हें फिर से निर्धारित करेगा।

मुझे पूरी तरह से यकीन नहीं था, इसलिए मैंने इसे अपने लिए बाहर करने की कोशिश की। इस नमूना वर्ग को लें:

import java.io.*; 

public class Test { 

    public static void main(String[] args) throws IOException { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); 

    String line = reader.readLine(); 
    System.out.println(line); 
    } 
} 

और इसे कमांड लाइन पर संकलित करें। फिर इसे चलाएं, लेकिन कुछ भी टाइप न करें। कार्यक्रम तब तक इनपुट पर अवरुद्ध होना चाहिए जब तक कि आप कोई अक्षर टाइप न करें, और जब तक आप एंटर टाइप न करें तब तक यह पिछले रीडलाइन की प्रगति नहीं करेगा। ps हमें इस प्रक्रिया के बारे में अधिक जानकारी बताने में सक्षम होना चाहिए। ps से अधिक विस्तृत जानकारी प्राप्त करने के लिए a ध्वज का उपयोग करें:

[email protected]<computer-name>] ps a 
    PID TT STAT  TIME COMMAND 
3846 s000 S  0:00.16 -zsh 
3992 s000 S+  0:00.40 /usr/bin/java Test 

के लिए पी एस आदमी पेज का कहना है:

राज्य राज्य वर्णों की एक अनुक्रम द्वारा दिया जाता है, उदाहरण के लिए, `` RWNA ''।

  • मैं मार्क्स एक प्रक्रिया है कि प्रयोग में नहीं है (के बारे में से अधिक समय 20 सेकंड के लिए सो): पहला वर्ण प्रक्रिया के रन राज्य इंगित करता है।
  • आर एक चलने योग्य प्रक्रिया को चिह्नित करता है।
  • एस ऐसी प्रक्रिया को चिह्नित करता है जो लगभग 20 सेकंड से कम समय तक सो रहा है।

और क्योंकि मैं सिर्फ प्रक्रिया शुरू कर दी, एस समझ में आता है। प्रक्रिया ओएस द्वारा शेड्यूलिंग की प्रतीक्षा कर रही है, सो रही है। दरअसल, यदि आप top चेक करते हैं, तो आप देखेंगे कि प्रक्रिया 0% सीपीयू ले रही है।

इसलिए इस कॉल के प्रदर्शन के बारे में चिंता न करें, कोई व्यस्त प्रतीक्षा या मतदान नहीं हो रहा है: सिस्टम आपके लिए आई/ओ कार्यक्रमों का ख्याल रख रहा है और समझदारी से आपकी प्रक्रिया को संभालेगा।

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