Plusieurs threads à l'aide du Système..println en Java

J'ai un multi-thread Java de l'application qui sera de sortie d'informations sur un message qu'il reçoit pour la console à des fins de débogage. Chaque fois que l'application reçoit un message, il va appeler une System.out.println(String) sur le message.

Le problème que je rencontre est que si l'application est inondé de messages, System.out.println() imprime des informations erronées (comme les anciennes informations de mémoire tampon). C'est ce qui m'a demander si il y a un problème thread où plusieurs threads sont l'appel de la println fonction à la fois, et n'est pas correctement vider la mémoire tampon.

Dans mon programme principal (fil), j'ai quelque chose à l'effet de:

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();
}

Dans mon fil, j'ai quelque chose à l'effet de:

@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.
}

Est-il un moyen simple pour moi d'avoir plusieurs threads d'impression à la console en même temps sans les tampons contenant de l'information ancienne?

Grâce

EDIT: mise à jour du code dans le thread principal pour être plus représentative de ce que mon programme est en train de faire.

Pouvez-vous montrer quelques-uns des "vieux de la mémoire tampon de l'information". System.out.println sont synchronisées de sorte que vous ne devrait pas avoir de "vieux" de l'information.
plusieurs threads d'impression à la console à la fois? vous voulez dire que chaque thread à la fois?
cela semble que vous avez 2 fils écrit à la même variable/champ quelque part, et ils sont d'écraser les uns les autres.
on dirait que vous êtes le partage de la mémoire tampon de l'objet avec plusieurs threads. Cela ne marchera pas. Chaque thread a besoin de sa propre mémoire tampon de l'objet, ou le thread principal doit convertir le contenu du buffer dans un local variable de chaîne, puis de passer la chaîne sur le fil.
donc, vous essayez de gérer de manière asynchrone un tampon qui est effacé immédiatement après l'appel asynchrone a été faite (ou même écrites)? Ce n'est pas aller au travail, vous devez transmettre une copie de buffer dans le ThreadToPrintTheMessage() ctor (sauf si vous effectuez une copie à l'intérieur du constructeur de vous-même.)

OriginalL'auteur Phanto | 2012-02-27