He escrito un programa que cuenta líneas, palabras y caracteres en un texto: lo hace con hilos. Funciona muy bien a veces, pero no tanto en otras ocasiones. Lo que termina sucediendo son las variables que apuntan a la cantidad de palabras y los caracteres contados a veces se quedan cortos y otras no.¿Cuándo sale un hilo de su alcance?
Me parece que los hilos a veces terminan antes de que puedan contar todas las palabras o caracteres que quieren. ¿Es porque estos subprocesos quedan fuera del alcance cuando se rompe el ciclo while (true)?
he incluido el código de la parte filiforme de mi problema a continuación:
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;}
}
(Sub Pregunta:. Esta es la primera vez que he pedido algo y código publicado no quiero para usar StackOverflow en lugar de google y wikipedia y me preocupa que esta no sea una pregunta adecuada? Traté de hacer la pregunta más general para que no solo pidiera ayuda con mi código ... pero, ¿hay alguna otra? sitio web donde este tipo de pregunta podría ser más apropiado?)
No he estado esperando que los hilos terminen. Tienes razón, solo estoy haciendo esto para familiarizarte con los métodos que usaré con los hilos: la tarea no requirió hilos. ¿Cómo esperas que termine un hilo? ¿Podría esperar a que Thread.activeCount() devuelva un número pequeño? – Ziggy
Thread.join() espera a que muera un solo hilo. Esperar a que el número de hilos sea igual a 1 podría funcionar: sospecho que podría encontrarse en condiciones de carrera con hilos que están en proceso de arranque, pero no estoy seguro. –
Si desea conocer los hilos, le recomiendo examinar la forma de hacer ejecutables Executor/thread pool/work queue. Una vez que entiendes, en realidad es mucho más fácil razonar que crear subprocesos manualmente. –