Terminar un hilo

Una pregunta, estoy trabajando con un hilo sobre una progress bar y todo funciona perfecto, el detalle que veo es cuando termina de ejecutarse el hilo la memoria ram no se libera. Por lo tanto si ejecuto ese proceso varias veces se termina por completo mi memoria y se pone demasiado lento.

Anexo codigo
public void run(){
while (life){ // Si pongo esta variable en true no entra, pero tampoco libera memoria
if (order == 1){
this.prog++;
this.progBar.setValue(this.prog);
try{
Thread.sleep(50);
}catch(Exception e){
e.printStackTrace();
}
}
}
}

Saludos

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

cuántas?

Cuántas veces lo debes ejecutar para que se termine la memoria y cuánta memoria tiene la JVM? Porque, ese código no ocupa prácticamente nada de memoria, no estás alojando nuevas variables ni objetos ni nada.

Si acaso el Thread que creas para ejecutar ese código lo guardas en un arreglo y nunca lo liberas, pues entonces se podría terminar la memoria, pero "varias veces" tendría que ser varias miles de veces, cientos de miles probablemente.

Lo más probable es que tu problema no tiene nada que ver con el hilo en sí, que únicamente está actualizando una barra de progreso, sino con la tarea que se tarda tanto en realizarse (y que fue la razón por la que tuviste que poner una barra de progreso).

Imagen de beto.bateria

Con otras palabras, verifica

Con otras palabras, verifica este metodo:

this.progBar.setValue(this.prog);

¿en setValue() creas objetos o llamas a otros metodos que crean objetos? si es asi, probablemente ese sea el problema.

Imagen de divad

5 veces

Con 5 veces que lo ejecuto en el administrador de tareas, el uso del CPU se pone al 100%. Y se libera al momento de cerrar el programa.

Pensé que era por el hilo que me estaba causando eso, buscare por la barra de progreso si dejo algo colgado.

Imagen de ezamudio

momento

Dijiste que se terminaba la memoria, ahora la queja es que el CPU se va al 100% - son dos cosas muy distintas.

Imagen de divad

Distinto

Si ya lo de la memoria lo solucione y detecte que ahora el 100% es el uso del cpu. Pero eso no encuentro ya como, se libera hasta que cierro la aplicaion

Imagen de ezamudio

ciclo

La receta más fácil para llevarte el CPU al 100% es esta:

new Thread() {
  public void run() {
    while (true);
  }
}.start();

Si las tareas que echas a andar en un hilo no dan pausa nunca, pues tendrás el CPU al 100%. Sólo tú sabes si eso es realmente un inconveniente o no; por lo general, mientras ninguna otra tarea quiera usar el CPU pues no hay ningún problema en que se use al 100%, para eso está, no? Pero si ya de plano está afectando otras tareas, es necesario hacer algo para que ese hilo suelte de vez en cuando el CPU. Para eso existe el método yield(), que le cede el CPU a otros hilos de vez en cuando. Simplemente lo invocas de vez en cuando, aunque no se recomienda su uso de manera común (o sea que cada vez que eches a andar algo en un Thread, lo incluyas en tu código) pero a veces es una buena solución.

Si algún hilo se queda atorado de manera indefinida es porque su condición de salida está mal; el método run() nunca termina. Primero enfócate a encontrar por qué nunca termina, y tal vez no sea necesario que invoques a yield() (que podría incluso no servir de nada si es que tu código realmente sólo es un ciclo que actualiza una barra de progreso).

Imagen de divad

Listo

muchas gracias si cambie mi ciclo, porque creo que si dejaba un hilo con el ciclo sin cerrar...

Te agradezco tu apoyo, muchas gracias...