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.
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
Vous devez vous connecter pour publier un commentaire.
Ici pourrait être un exemple de code pour résoudre le problème:
Ce n'! Vous et Alexandre Pavlov identifié quel était le problème... j'ai essayé d'imprimer un tampon qui a été partagé et modifié par une autre ressource.
OriginalL'auteur Sam Goldberg
System.out.println()
est déjà synchronisée.à droite, juste pensé que ce pourrait avoir été une course entre
println()
etflush()
, mais évidemment ce n'est pas le cas. @Phanto, ce genre de sortie en êtes-vous?veuillez voir le commentaire dans le poste principal.
si vous n'utilisez pas synchronisés bloc, alors il pourrait être en condition de course entre println() et flush() si oui, alors pourquoi/comment? si non, puis aussi pourquoi/comment?
Oui, il peut être un. Pourquoi pas?
OriginalL'auteur Alexander Pavlov
Je n'ai pas le temps de vérifier println source de être sûr que c'est thread-safe toujours (vous pouvez, si vous voulais), mais êtes-vous sûr que votre println est le problème? Il se pourrait bien que le code est en cours d'exécution à des époques très différentes que vous le pensez. Threads souvent obtenir accroché sur les serrures ou tout simplement oubliés par le planificateur, de sorte que ce que vous pensez devrait fonctionner A, B, C, D peuvent exécuter B, C, D, A. Ensuite, vous vous demandez pourquoi println est foiré, impression de la dernière que vous pense couru en premier. Et c'est vraiment un exemple simple. La différence entre ce que vous attendez avec le multi-threading et ce qui ne peut être véritablement étonnantes. Généralement, plus le fil-à-core ratio, le pire c'est. Single core machines toujours faire tout le contraire de ce que vous attendez.
Et vous n'avez même pas besoin de plusieurs threads à ce problème. Mes premières secousses sont venus avec des files d'attente d'événement (sur Windows 3.1), ce qui ne partagent pas mon point de vue sur quand les choses devraient fonctionner. Il m'a fallu un certain temps à comprendre que les messages étaient brouillés parce que l'OS avait une toute autre idée de la façon dont ils doivent s'exécuter que j'ai fait.
Il peut y avoir des subtilités du Système..println et de couleur que je ne sais pas, mais même lorsque vous obtenez tous que le travail, être conscient que les discussions ont plutôt contrairement esprit de leurs propres. Même Enregistreur ne suffit pas à résoudre tous vos problèmes.
OriginalL'auteur RalphChapin
Vous devriez être en utilisant Java.util.l'exploitation forestière ou de certains autres de journalisation pour ce but.
http://docs.oracle.com/javase/1.4.2/docs/api/java/util/logging/Logger.html
ajout d'un exemple de base
OriginalL'auteur Usman Ismail