2012-03-29 16 views
3

Kann mir jemand sagen, warum ich immer diese seltsame Ausgabe nach dem Ausführen dieser Schleife habe? Ist das ein Threading-Problem oder was?Seltsame Ausgabe beim Ausführen einer Schleife

for(int i=0;i<10;i++){ 
    System.out.println("out: "+i); 
    System.err.println("err: "+(i+1)); 
    } 

-> OUTPUT:

err: 1 
    out: 0 
    err: 2 
    err: 3 
    err: 4 
    out: 1 
    out: 2 
    out: 3 
    out: 4 
    err: 5 
    out: 5 
    err: 6 
    out: 6 
    err: 7 
    err: 8 
    out: 7 

    out: 8 
    err: 9 
    out: 9 
    err: 10 
    out: 10 

Antwort

11

Ihr Terminal führt Ihre Anwendung aus und verfügt über zwei Dateideskriptoren, einen für stdout und einen für stderr. Es muss dann Daten lesen, die Ihre Anwendung für diese Dateideskriptoren ausgibt, und sie auf dem Bildschirm rendern. Es gibt keine Garantie, wie die Terminal-Anwendung (oder das Betriebssystem für diese Angelegenheit) diese Interaktion implementiert. Stellen Sie sich vor, dass Terminal tatsächlich zwei Threads hat, die parallel von stdout und stderr lesen. Die Reihenfolge, in der diese 2 Threads Daten von fds erhalten und auf dem Bildschirm angezeigt werden, ist nicht garantiert, dass sie sequenziell sind, wenn Ihre App sie ausgibt.

+0

Das ist interessant. Ich habe anfangs abgelehnt, weil ich dachte, das sei falsch. Ich ging davon aus, dass Java 'System.out' puffert und' System.err' nicht gepuffert ist. Aber wenn ich eine Klasse von der Kommandozeile aus laufe, sehe ich "oeoeoeoeoeoeoee" 'perfekt verschachtelt. Das bedeutet, dass die Anwendung etwas anderes macht. Faszinierend. Danke @MK. +1 – Gray

+0

@Gray Ich denke, Sie haben Recht, dass System.err nicht gepuffert ist, aber ich denke nicht, dass diese sich gegenseitig ausschließen. Ich habe versucht, ein allgemeines Gefühl dafür zu vermitteln, warum diese ineinander übergehen. Ich denke auch, Drucken \ n könnte zu Spülen führen? In diesem Fall wäre das Verhalten von stdout und stderr dasselbe. –

+0

Mein Kommentar stimmte nicht mit dir überein. Ich stimme völlig zu. Standardmäßig wird der PrintStream nicht geleert, wenn er '\ n' sieht. Ich bin mir nicht sicher, wie 'System.out' und' System.err' konfiguriert wurden. – Gray

3

Standardausgabe und Standardfehler haben separate Puffer. Die Verschachtelung ist normal. Versuchen Sie flushing den Ausgabestrom nach jedem Druckaufruf.