Domanda

Ho un multi-threaded applicazione Java che sarà in uscita le informazioni su un messaggio che riceve per la console di debug.Ogni volta che l'applicazione riceve un messaggio, una chiamata System.out.println(String) sul messaggio.

Il problema che sto avendo è che, se l'applicazione viene inondato di messaggi, System.out.println() stampa informazioni errate (come il vecchio informazioni di buffer).È questo che mi chiedo se c'è un problema di threading in cui più thread sta chiamando il println funzione in una sola volta, e non correttamente lo svuotamento del buffer.

Nel mio programma principale (thread), ho qualcosa per l'effetto di:

while(iterator.hasNext())
{
    SelectionKey key = iterator.next();

    channel.receive(buffer);     // The buffer is a ByteBuffer.
    buffer.flip();

    new Thread(new ThreadToPrintTheMessage(buffer)).start();

    buffer.clear();

    iterator.remove();
}

Nel mio thread, ho qualcosa per l'effetto di:

@Override
public void run()
{
    System.out.println(message);
    System.out.flush();   // I have better results with this.  But, it doesn't
                          // fully resolve the issue.
}

C'è un semplice modo per me di avere più thread stampare la console, senza buffer contenente le informazioni?

Grazie

EDIT:aggiornato il codice nel thread principale per essere più rappresentativo di ciò che il mio programma sta facendo.

È stato utile?

Soluzione

Qui potrebbe essere un codice di esempio per risolvere il problema:

while(iterator.hasNext())
{
    SelectionKey key = iterator.next();

    channel.receive(buffer);     // The buffer is a ByteBuffer.
    buffer.flip();
    byte[] bytes = new byte[buffer.limit()];  // copy buffer contents to an array
    buffer.get(bytes);
    // thread will convert byte array to String
    new Thread(new ThreadToPrintTheMessage(bytes)).start();

    buffer.clear();

    iterator.remove();
}

Altri suggerimenti

synchronized (System.out) {
    System.out.println(message);
    System.out.flush();
}

Non ho il tempo di controllare println essere fonte di essere sicuro che sia thread-safe sempre (si potrebbe, se si voleva), ma siete sicuri che il vostro println è di sbagliato?Può ben essere che il codice è in esecuzione molto diverse volte di quanto si pensi.Thread spesso ottenere appeso su blocchi o semplicemente dimenticare l'utilità di pianificazione, in modo da ciò che si pensa dovrebbe eseguire A, B, C, D a, B, C, D, A.Poi ci si stupisce perché println è incasinato, stampa ultima cosa pensare correva prima.E questo è un esempio molto semplice.La differenza tra ciò che potrebbe accadere con il multi-threading e che cosa accade può essere davvero sorprendente.Generalmente, maggiore è il thread per core ratio, il peggio è.Single core macchine sempre fare tutto il contrario di quello che ci si aspetterebbe.

E non hai nemmeno bisogno di più thread per questo problema.Il mio primo scossoni è venuto con code di eventi (Windows 3.1), che non condivide le mie opinioni su quando le cose dovrebbero funzionare.Mi ci è voluto un po ' per capire che i messaggi sono criptati perché il sistema operativo ha una idea diversa di come dovrebbe funzionare quello che ho fatto.

Ci potrebbero essere alcune sottigliezze del Sistema.out.println e colore che non so, ma anche quando si ottiene tutto ciò che di lavoro, essere consapevoli del fatto che i thread sono piuttosto contrario menti dei loro propri.Anche Logger non risolverà tutti i vostri problemi.

Dovresti usare java.util.logging o qualche altro framework di registrazione per questo scopo.

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/logging/logger.html

import java.util.logging.Logger;
....
Logger log = Logger.getLogger("com.something.something");
....
log.log(Level.Info, "Message");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top