J'ai écrit un programme qui compte les lignes, les mots et les caractères dans un texte: il le fait avec des threads. Ça marche parfois bien, mais pas très bien d'autres fois. Ce qui finit par arriver, c'est que les variables pointant vers le nombre de mots et de caractères comptés sont parfois courtes et parfois non.quand un thread est-il hors de portée?
Il me semble que les threads se terminent parfois avant de pouvoir compter tous les mots ou caractères qu'ils veulent. Est-ce parce que ces threads sortent de la portée quand la boucle while (true) se casse?
J'ai inclus le code de la partie filiforme de mon problème ci-dessous:
private void countText() {
try {
reader = new BufferedReader(new FileReader("this.txt"));
while (true) {
final String line = reader.readLine();
if(line == null) {break;}
lines++;
new Thread(new Runnable() {public void run() {chars += characterCounter(line);}}).start();
new Thread(new Runnable() {public void run() {words += wordCounter(line);}}).start();
println(line);
}
} catch(IOException ex) {return;}
}
(Sous Question:. Ceci est la première fois que je l'ai demandé quelque chose et le code posté je ne veux pas utiliser StackOverflow à la place de google et de wikipedia et je m'inquiète que ce n'est pas une question appropriée? J'ai essayé de rendre la question plus générale afin que je ne demande pas seulement de l'aide avec mon code ... mais, y at-il un autre site Web où ce genre de question pourrait être plus approprié?)
Je n'attendais pas la fin des discussions. Vous avez raison, je fais juste cela pour connaître les méthodes que j'utiliserai avec les threads: l'affectation ne nécessitait pas du tout de threads. Comment attendez-vous qu'un fil finisse? Pourrais-je juste attendre Thread.activeCount() pour retourner un petit nombre? – Ziggy
Thread.join() attend la mort d'un seul thread. Attendre que le nombre de threads soit égal à 1 pourrait fonctionner - je suppose que vous pourriez rencontrer des conditions de course avec des threads en cours de démarrage, mais je ne suis pas sûr. –
Si vous voulez obtenir le fil des discussions, je vous recommande de regarder dans la façon d'exécuter les tâches de l'Executor/pool de threads/file d'attente. Une fois que vous avez compris, il est beaucoup plus facile de raisonner que de créer des threads manuellement. –