Fils et écriture de fichier
J'ai un programme java qui utilise 20 threads. Chacun d'entre eux d'écrire leurs résultats dans un fichier appelé output.txt
.
Je reçois toujours un nombre différent de lignes dans output.txt
.
Peut-il être un problème avec la synchronisation des threads? Est-il un moyen de gérer cela?
source d'informationauteur RazorMx
Vous devez vous connecter pour publier un commentaire.
Oui.
Oui, s'assurer que les écritures sont sérialisés par la synchronisation sur un mutex. Ou, à l'inverse, ont seulement un thread que des sorties vers le fichier, et vous disposez de tous les autres threads simplement la file d'attente de texte à être écrit dans une file d'attente que l'un thread d'écriture attire de. (De cette façon, le 20 threads principaux ne pas bloquer sur les I/O.)
Re le mutex: Par exemple, si elles utilisent toutes le même
FileWriter
exemple (ou autre), que j'appelleraifw
ils pourraient l'utiliser comme un mutex:Si ils sont chacun à l'aide de leurs propres
FileWriter
ou que ce soit, de trouver quelque chose d'autre, ils ont tous en commun d'être le mutex.Mais encore une fois, d'avoir un thread qui effectue l'I/O au nom des autres est probablement aussi une bonne façon d'aller.
Je vous suggère d'organiser de cette façon: Un thread consommateur de consommer toutes les données et écrire dans le fichier. Tous les threads de travail permettra de produire des données pour le thread consommateur en synchrone. Ou avec plusieurs threads d'écriture de fichier vous pouvez utiliser un mutex ou verrouille implémentations.
Si vous voulez un semblant de performance et de facilité de gestion, rendez-vous avec le producteur-consommateur de la file d'attente et qu'un seul fichier-écrivain, comme suggéré par Alex et les autres. Permettre à tous les fils au fichier avec un mutex est juste confus, chaque disque retard est transféré directement dans votre application principale fonctionnalité, (avec ajout d'un conflit). Cela est particulièrement solennelle avec la lenteur des lecteurs réseau qui ont tendance à disparaître sans avertissement.
Vous devez utiliser la synchronisation dans ce cas. Imaginez que 2 fils (t1 et t2) ouvrez le fichier dans le même temps, et commencer à écrire. Les modifications apportées par le premier thread sont écrasé par le deuxième thread parce que le deuxième thread est le dernier à enregistrer les modifications dans le fichier. Lorsqu'un thread t1 qui est écrit dans le fichier, t2 doivent attendre jusqu'à ce t1 fin de tâche avant de pouvoir l'ouvrir.
Si vous pouvez tenir votre fichier en tant que
FileOutputStream
vous pouvez le verrouiller comme ceci:Bien, sans aucun détail de l'implémentation, il est difficile de savoir, mais comme mon cas de test montre, j'ai toujours de 220 lignes de sortie, c'est à dire, un nombre constant de lignes, avec
FileWriter
. Notez qu'aucunesynchronized
est utilisé ici.Que je comprends (et de tester), il y a deux phases dans ce processus:
Bien, c'est comme une foule qui les attend à l'extérieur d'une salle de bains, sans file d'attente.....
Donc, si votre œuvre est différent, montrer le code et nous pouvons vous aider à le décomposer.