2010-09-28 15 views
9

Digamos que engendro un hilo cada dos segundos utilizando el siguiente método y cada hilo tarda alrededor de un segundo en completarse. ¿Los hilos terminados se eliminan?Los hilos java se eliminan cuando terminan

new Thread (new myRunnableClass()).start(); 
+2

Si el proceso es tan simple como su ejemplo, y se garantiza que cada subproceso finalizará antes de que comience el siguiente, ¿puede simplemente reutilizar un hilo? Supongo que tu programa real es más complejo que eso, pero solo estoy lanzando la sugerencia. –

+0

@musicfreak: Sabes, acabas de mencionar un punto muy bueno. Por alguna razón he estado haciendo eso en otros lugares y creo que esta situación se veía un poco diferente, pero descubrí una forma de aplicar esta técnica a mi problema. ¡Gracias! – Dave

Respuesta

6

El subproceso nativo a nivel del sistema operativo se libera tan pronto como termina el hilo (aproximadamente cuando termina run()), pero el objeto de hilo vive, como cualquier otro objeto, hasta que se vuelve inalcanzable y el recolector de basura tiene ganas de correr.

Editar: También podría ser interesante saber que Thread (en de Sun aplicación de Oracle, anywho) tiene un método privado llamado por la máquina virtual cuando el hilo termina, que los nulos agresivamente varios campos, incluyendo la que se refiere al Runnable establecido por el constructor Thread(Runnable). Por lo tanto, incluso si conserva una referencia al Thread, las cosas que no necesita después de finalizar la ejecución serán liberadas, independientemente.

5

No lo llamaría eliminado. Una vez que el hilo se completa, irá a estado muerto preparándose para ser recogido por la JVM.

+3

... a menos que alguna otra estructura de datos "en vivo" mantenga una referencia al objeto de la secuencia. Con el ejemplo presentado en el OP que no sería un problema. – Pointy

+1

... pero ese es un patrón que ocurre cuando quieres 'join()' los hilos, por ejemplo, para recuperar algunos resultados del 'Runnable', pero de nuevo, no puedes hacer eso en tu ejemplo ya que' La referencia de Runnable se pierde. – jbindel

2

Engendrar un nuevo hilo es un proceso bastante costoso. Lo que quieres es un grupo de hilos. Hay diferentes formas de hacerlo: here's one.

+3

Los hilos de desove * eran * caros en los sistemas * nix (* a saber, Linux *) hace mucho tiempo, pero en kernel 2.4 (* o era 2.6? *) Cambiaron su sistema de subprocesamiento de modo que engendrar nuevos hilos ahora es prácticamente gratuito. Tenga en cuenta que en los entornos de Windows, los hilos de desove siempre han sido bastante baratos. Dicho esto, usar grupos de hilos es algo inteligente, porque naturalmente siempre hay algo de sobrecarga y rara vez necesitas tener mil millones de subprocesos cuando una docena lo haría. – Esko

Cuestiones relacionadas