2010-04-21 15 views
5

Hasta ahora he usado mi aplicación como un producto independiente. Entonces, cuando el usuario presionó el botón "Parar", llamé al System.exit(0); y estuvo bien.¿Cómo puedo cerrar mi software de forma segura?

Ahora mi aplicación será llamada (de forma programática) desde otro programa. Entonces, me temo que System.exit(0); matará no solo mi proceso sino también el software externo que inició mi programa.

Entonces, ¿cuál es la forma correcta de cerrar mi aplicación si se recibe una solicitud correspondiente de un software externo? Mi aplicación es una aplicación GUI. Por lo tanto, quiero cerrar la ventana, pero también quiero cerrar todos los procesos realizados por mi programa.

añadido:

Para ser más específicos, que quiere cerrar todas las discusiones iniciadas por mi programa. Mi programa no inicia ningún proceso de sistema operativo ni ningún otro programa.

+0

@Roman: por * "procesos realizados por mi programa" * quiere decir todos los hilos que su programa Java está ejecutando o generó su programa, por ejemplo, otros ejecutables (Un * x procesos de shell, .exe, otro Programa Java ejecutándose en su VM, lo que sea) – SyntaxT3rr0r

+0

@WizardOfOdds, me refiero a "todos los hilos que mi programa Java está ejecutando". – Roman

+1

¿Cómo se invoca su programa? ¿Algún método lo llama un programa Java que ya se está ejecutando, por lo que los dos se convierten en un solo programa? ¿O es el otro programa que realiza una llamada al sistema para iniciar una nueva máquina virtual de Java con su programa? –

Respuesta

0

Siempre que su programa no esté compartiendo un servidor de aplicaciones con otros, apagar la VM llamando al System.exit(0) termina todos los hilos.

De Javadoc System.exit pone término a los actualmente en ejecución de Java Virtual Machine)

EDIT: Si usted quiere hacer algo de limpiar el código antes de la parada, http://java.sun.com/j2se/1.4.2/docs/guide/lang/hook-design.html

+0

@stacker, ¿quiere decir que 'System.exit (0)' cerrará todos los subprocesos, incluido el subproceso del software externo (que inició mi programa). – Roman

+1

Matará a la JVM. Entonces, si el software externo inició su programa al generar un proceso Java, estará bien. Si el software externo es un código de Java que simplemente crea una instancia de su (s) clase (s) y las ejecuta, entonces ese código externo será eliminado también. –

2

Si los hilos que ha puesto en marcha son seguir procesando y luego llamar a System.exit (0) hará que se eliminen. En algunos casos, esto puede dejar su aplicación en un estado incoherente. Imagine que el hilo estaba guardando un archivo, por ejemplo.

Debe asegurarse de que todos sus subprocesos estén "felices" de morir antes de llamar a System.exit.

Una de las técnicas que puede usar para esto con hilos de larga ejecución es la intoxicación. Para hacer esto, envíe a los hilos un mensaje de que ahora deben morir con elegancia, es decir, un mensaje poson. Una vez que todos han muerto, es seguro llamar a System.exit (0) para finalizar el subproceso de manejo de eventos Swing.

Existen muchas maneras diferentes de implementar el envenenamiento; puede establecer una variable de indicador global que los hilos comprueban para ver si se han envenenado o pueden usar las bibliotecas de subprocesamiento de Java 5. Echar un vistazo a este Javadoc, por ejemplo, y encontrará referencias a esta técnica:

http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/BlockingQueue.html

0

No está en "una talla única para todos" respuesta a esta que es una gota en el reemplazo para el Sistema .exit, por desgracia.

Por lo general, necesitará establecer algún tipo de indicador que indique a todos sus hilos que es hora de salir, y asegúrese de que revisen este indicador regularmente. Esto les permitirá limpiar con gracia sin detenerse abruptamente, y también asegura que los efectos estén limitados a sus propios componentes. En este caso, el hilo principal de su aplicación también observaría el indicador, esperaría a que terminaran todos los hilos del tipo "trabajador" y luego volvería a la pila hasta que se alcanzara el punto de entrada de la aplicación.

Esta pregunta no es muy diferente de los métodos obsoletos Thread.stop (etc), especialmente en lo que respecta a reemplazar System.exit con algo más respetuoso. En esa luz, el why is Thread.stop() deprecated page puede ser una lectura útil.

Lanzar una excepción (una personalizada llamada algo así como ApplicationStopException) para desenrollar la pila del hilo principal no es una mala idea; esto le impide tener que manejar la lógica especial en todo su código y, en su lugar, permite que el "mensaje" se propague a los niveles superiores, donde pueden tomar las medidas necesarias para salir de su programa con elegancia.

0

Te recomiendo que marques para detener el hilo para que el hilo sepa cuándo debe detenerse. Para GUI y ventana, puede llamar a frame.dispose().

Para System.exit(), creo que no afectará a la persona que llama, puede intentar ver cuál es el efecto real pero como otras personas ya recomendaron, no lo llames directamente así, simplemente deja que se detengan los subprocesos por sí mismo

Cuestiones relacionadas