2011-02-03 13 views
8

मैं चारों ओर बेवकूफ़ बना रहा था कि मैं अपने encapsulation कैसे स्थापित कर सकता था।प्रोग्राम निष्पादन अनुक्रमिक है। क्यूं कर?

लेकिन मेरा प्रोग्राम एक अप्रत्याशित क्रम में निष्पादित कर रहा है।

"मुख्य":

package research.debug; 

public class Main { 

public static void main(String[] args) { 

    Boolean b = Boolean.TRUE ;  

    Debug.black.printVariable(b, "b") ; 
    Debug.red.printVariable(b, "b") ; 

    System.out.println("SUPPOSED to be inbetween...") ; 

    Debug.black.println("Hello") ; 
    Debug.red.println("Howdie") ; 

} 

} 

"डीबग":

package research.debug; 

public class Debug { 

public static final Output black = new Output(Output.BLACK) ; 
public static final Output red = new Output(Output.RED) ; 

} 

और अंत में, "उत्पादन":

package research.debug; 

public class Output { 

public static final int BLACK = 0 ; 
public static final int RED = 1 ; 

private int outputMode = 0 ; 

public Output(int outputMode) { 

    this.outputMode = outputMode ; 

} 

public void println(String msg) { 

    if(outputMode == Output.BLACK) { 
     System.out.println("Printed with black font: " + msg) ; 
    } else { 
     System.err.println("Printed with red font: " + msg) ; 
    } 

} 

public void printVariable(Object variable, String variableName) { 

    println(variableName + " = \"" + variable + "\"") ; 

} 

} 

यहाँ मेरी बल्कि एक सरल कोड है और अपेक्षित आउटपुट होगा:

काला फ़ॉन्ट के साथ मुद्रित: ख = "true"

लाल फॉन्ट के साथ मुद्रित: ख = "true"

inbetween होना चाहिए ...

काला फ़ॉन्ट के साथ मुद्रित: हैलो

लाल फॉन्ट के साथ मुद्रित: howdie

लेकिन, इस तरह के बजाय उम्मीद के आदेश से बाहर है:

काला फ़ॉन्ट के साथ मुद्रित: ख = "true"

inbetween होना चाहिए ...

काला फ़ॉन्ट के साथ मुद्रित: हैलो

लाल फॉन्ट के साथ मुद्रित: ख = "true "

लाल फॉन्ट के साथ मुद्रित: howdie

क्या हो रहा है?

संपादित करें: कभी-कभी "बीच में रहने के लिए माना जाता है" संदेश चारों ओर घूमता है। कोड बदलने के बिना।

उत्तर

18

System.out buffered और System.err नहीं है, वे दो अलग-अलग धाराएं हैं, और आपके कुछ संदेश एक दूसरे के पास जाते हैं।

इसलिए, इन मिश्रित संदेशों System.out को प्रिंट के रूप में की उम्मीद क्रम में प्रकट नहीं हो सकता, देरी होती है जबकि System.err करने के लिए उन अभी लिखा जाना चाहिए जब तक बफर (स्वयं या स्वचालित) प्लावित है।

आप flush() विधि को कॉल करके मैन्युअल रूप से स्ट्रीम स्ट्रीम कर सकते हैं।

+0

वाह मुझे यह कभी नहीं पता था। यह मेरे कोड के साथ कुछ चीजों को समझाता है – TheLQ

6

आप System.err और System.out पर प्रिंट कर रहे हैं। बफर को फ्लश करने के लिए केवल System.out पर प्रिंट करने का प्रयास करें या System.out.flush() का उपयोग करें।

4

लाल/काले लिखने क्रमशः दो अलग-अलग धाराओं में लिख रहे हैं: System.err और System.out क्रमशः।

ये धाराएं पूरी तरह स्वतंत्र हैं और अलग-अलग समय पर फ्लश होती हैं।

केवल बात यह है कि गारंटी है (जब तक आप एक से अधिक थ्रेड उपयोग कर रहे हैं) है कि जो कुछ भी आप System.out को लिखने System.err के लिए के रूप में लिखा एक ही क्रम में दिखाई देगा, और वैसे ही है, लेकिन कैसे वे एक साथ मिश्रित कर रहे हैं के रूप में कोई गारंटी नहीं है।

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