2011-02-03 14 views
8

Stavo scherzando con come avrei potuto impostare il mio incapsulamento.L'esecuzione del programma non è sequenziale. Perché?

Ma il mio programma è in esecuzione in un ordine imprevisto. Qui è il mio codice piuttosto semplice:

La "principale":

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") ; 

} 

} 

"Debug":

package research.debug; 

public class Debug { 

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

} 

E, infine, "Uscita":

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 + "\"") ; 

} 

} 

E l'uscita prevista sarebbe:

stampati con caratteri neri: b = "true"

stampati con caratteri rossi: b = "true"

suppone che sia inbetween ...

stampato con caratteri neri: Ciao

stampati con caratteri rossi: Howdie

ma è invece fuori nell'ordine previsto, in questo modo:

stampati con caratteri neri: b = "true"

suppone che sia inbetween ...

stampato con caratteri neri: Ciao

stampato con caratteri rossi: b = "true "

stampato con caratteri rossi: Howdie

Cosa sta succedendo?

MODIFICA: A volte il messaggio "Supposto di essere in mezzo" si sposta. Senza di me cambiare il codice.

risposta

18

System.out è memorizzato nel buffer e System.err non è, sono due flussi diversi e alcuni dei tuoi messaggi passano a uno, alcuni all'altra.

Quindi, questi messaggi misti potrebbero non apparire nell'ordine atteso poiché le stampe a System.out vengono ritardate fino a quando il buffer non viene scaricato (manualmente o automaticamente), mentre quelle a System.err devono essere scritte subito.

È possibile scaricare manualmente uno stream chiamando il metodo flush().

+0

Wow, non l'ho mai saputo. Spiega alcune cose con il mio codice – TheLQ

6

Si sta stampando su System.err e System.out. Prova a stampare solo su System.out o usa System.out.flush() per svuotare i buffer.

4

Le scritture rosso/nero stanno scrivendo in due flussi diversi: System.err e System.out rispettivamente.

Questi flussi sono completamente indipendenti e scorrono in tempi diversi.

L'unica cosa che è garantita (a meno che non si utilizza più thread) è che ciò che si scrive a System.out appariranno nello stesso ordine come scritto, e allo stesso modo per System.err, ma non ci sono garanzie per quanto riguarda il modo in cui sono mescolati insieme.