2011-02-07 7 views
5

Por ejemplo, si tengo un programa de línea de comandos java que genera un nuevo hilo (subproceso n. ° 2) para realizar un sondeo, y luego duermo durante 5 minutos. mientras el hilo principal (subproceso n. ° 1) del programa se está ejecutando y luego termina antes de que los 5 minutos del subproceso n. ° 2 estén activados, por lo que el programa saldrá. hay algun problema con esto? ¿Debo interrumpir el hilo nº 2 en el hilo nº 1 antes de que finalice la función principal en este programa?¿Es malo que una aplicación java se cierre mientras hay un hilo separado durmiendo?

+1

El programa no termina simplemente porque la función principal ha finalizado. Todos los subprocesos no daemon deben finalizar para que el programa se termine normalmente. – ILMTitan

Respuesta

2

Puede ser considerado una mala práctica y un signo de diseño deficiente por algunos, pero en principio no debería haber ningún problema para terminar la JVM con System.exit. No, si no hay limpieza para ser realizada por el Subproceso # 2.

Otro problema es si el subproceso nº 2 puede estar en el medio de alguna acción.

+0

Además, si un hilo se puede "matar" de forma segura en cualquier momento, podría (o de hecho debería) marcarse como daemon. – biziclop

+0

@biziciop, buen punto. – aioobe

0

Depende enteramente de lo que está haciendo. Cuando el programa finalice, el proceso terminará, tomando cualquier hilo adicional con él. El único problema potencial sería si el subproceso n. ° 2 tiene algún control de recursos. Sin embargo, si todo lo que hace es leer, entonces no debería tener un problema.

0

Los subprocesos no deamon se siguen ejecutando en segundo plano después de que main ha finalizado la ejecución.
Como resultado, tendrá hilos colgantes a menos que explícitamente llame al System.exit, lo que mata a todos los hilos.
Sin embargo, el mejor enfoque sería detener el hilo # 2.
Simplemente use un indicador de estado, p. boolean die en el hilo nº 2.
El subproceso # 1 interrumpirá el subproceso n. ° 2, el subproceso n. ° 2 verá el indicador de troqueles (establecido por el subproceso n. ° 1) establecido en verdadero, hará las limpiezas necesarias y saldrá con elegancia.
En su caso, el hilo # 2 está durmiendo durante 5 minutos y no hará nada, estará bien.

+0

Recuerda dejar que el indicador de morir sea del tipo 'AtomicBoolean' o al menos volátil. – aioobe

0

Eche un vistazo a here.

Para la finalización de un programa Java, es necesario que todos los subprocesos no daemon terminen primero.
Una vez que todos los subprocesos no daemon detienen su ejecución, la JVM eliminará todos los subprocesos de daemon y se cerrará.

En su caso, no debería haber ningún problema, a menos y hasta que su Thread #2 esté desempeñando alguna función importante, como el manejo de recursos.

Cuestiones relacionadas