2011-02-03 23 views
8

Estaba bromeando sobre cómo podría configurar mi encapsulación.La ejecución del programa no es secuencial. ¿Por qué?

Pero mi programa se está ejecutando en un orden inesperado. Aquí está mi código bastante simple:

El "principal":

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

} 

} 

"Depuración":

package research.debug; 

public class Debug { 

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

} 

Y, por último, "Salida":

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

} 

} 

Y el resultado esperado sería:

impreso con la fuente negro: b = "true"

impreso con letras rojas: b = "true"

supone que es entre medio ...

Impreso con la fuente negro: Hola

impreso con letras rojas: Howdie

sino que está fuera del orden esperado, así:

impreso con la fuente negro: b = "true"

supone que es entre medio ...

Impreso con la fuente negro: Hola

impreso con letras rojas: b = "true "

impreso con letras rojas: Howdie

¿Qué está pasando?

EDITAR: A veces el mensaje "Supposed to between in" se mueve. Sin que yo cambie el código.

Respuesta

18

System.out se almacena en el búfer y System.err no lo está, son dos secuencias diferentes, y algunos de sus mensajes van a uno, algunos a otro.

Por lo tanto, estos mensajes mixtos pueden no aparecer en el orden esperado ya que las impresiones a System.out se retrasan hasta que se vacía el búfer (manual o automáticamente), mientras que los datos a System.err deben escribirse de inmediato.

Puede vaciar una secuencia manualmente llamando al método flush().

+0

Wow, nunca supe esto. Sí explica algunas cosas con mi código – TheLQ

6

Está imprimiendo a System.err y System.out. Intente imprimir solo al System.out o use System.out.flush() para enjuagar los buffers.

4

Las escrituras rojo/negro están escribiendo en dos flujos diferentes: System.err y System.out respectivamente.

Estas transmisiones son completamente independientes y se limpian en diferentes momentos.

Lo único que está garantizado (a menos que esté utilizando múltiples hilos) es que todo lo que se escribe en System.out van a aparecer en el mismo orden como está escrito, y lo mismo para System.err, pero no hay garantías en cuanto a la forma en que se mezclan entre sí.

Cuestiones relacionadas