perche questo codice java:Race tra lo System.out e System.err in java
public class CMain {
public static void main(String[] args){
for (int i = 0; i < 10; i++) {
System.out.println("A");
System.err.println("B");
}
}
}
da un rapido sguardo al codice, alcuni di noi possono pensare l'uscita deve essere la stampa di As e Bs in alternativa. Tuttavia non lo è! È un'apparizione casuale di 10 caratteri A e 10 B. Qualcosa di simile a questo:
Perché? e qual è la soluzione per far sì che gli As e Bs vengano visualizzati alternativamente (A B A B A B ...) Prima di porre questa domanda, ho controllato diverse altre domande simili per la soluzione e non funzionanti per il mio caso! Ho portato alcuni di loro qui:
- Synchronization and System.out.println
- Java: synchronizing standard out and standard error
- Java: System.out.println and System.err.println out of order PS. Utilizzo Eclipse come IDE
Quelli sono due diversi flussi che capita di essere uniti nella stessa console. Se vuoi tutto in un unico posto e in un dato ordine, perché non usi un singolo stream (fuori O err)? –
Penso che la risposta sia nel tuo secondo link "Il problema è che è responsabilità dell'emulatore di terminale (nel tuo caso, Eclipse) elaborare l'output standard e l'errore standard dell'applicazione, senza comunicare con l'emulatore di terminale non si può mai essere certi che i messaggi errati vengano visualizzati nell'ordine corretto, pertanto, prenderei in considerazione la possibilità di stampare tutto su err e di reindirizzare il file su un file. È comunque possibile utilizzarlo per un'interazione utente pulita." – KevinDTimm
Entrambi gli stream sono sincronizzati, ma non sullo stesso lock, quindi dovresti aspettarti qualche interleaving ... Comunque, ogni stream, individualmente, sarà ordinato. – assylias