quarta-feira, 1 de julho de 2009

Como encerrar sua aplicação Java

Existem diversas formar de encerrar sua aplicação. E às vezes é preciso que algo seja feito antes que isso aconteça, seja pra consistir dados, seja pra mostrar uma mensagenzinha de tchau pro usuário (Sim, isso é tosco. Não façam isso.). Muita gente usa o evento windowClosing do AWT na janela principal do programa. No entanto, existe um método mais eficiente (e garantido) de fazer isso.

A Máquina Virtual do Java (JVM) se desliga de dois jeitos diferentes: Do jeito normal e bonitinho System.exit(); (ou quando a última Thread ativa do programa termina sua execução) OU do modo abrupto (abrupto é uma palavra que dá medo), quando o usuário pressiona Ctrl+C no console (ou prompt), ou quando o usuário taca o dedo no botão Power, desligando o Sistema Operacional.

O Runtime da JVM possui um método chamado addShutdownHook(Thread t), que, resumindo, vai fazer o seguinte: A Thread t vai ser registrada no Runtime, mas não vai ser executada. Vai ficar lá, paradinha. Daí, antes de a JVM ser encerrada, ela acorda a Thread t, e a Thread t executa seu método run(), antes do juízo final :)

Para evitar que sua aplicação termine sem que determinado processamento necessário seja feito, basta fazer o seguinte:

1) Criar uma classe, herdando de Thread. Dentro dessa classe, no método run(), deverá haver o código que você quer processar anter da finalização.


private class ShutdownInterceptor extends Thread {
public void run() {
//Aqui você diz adeus.
System.out.println("Por que você me abandona? Sentirei saudades.");
}
}


2) Dentro de sua aplicação, insira o seguinte código, indicando à JVM que você quer colocar sua classe bonitinha no shutdownHook:


ShutdownInterceptor shutdownInterceptor = new ShutdownInterceptor();
Runtime.getRuntime().addShutdownHook(shutdownInterceptor); // <- Mágica


E pronto! Agora, quando seu sistema for finalizado, o sistema fará uma chantagem emocional com o usuário, obrigando-o moralmente a reiniciar sua aplicação e viver com ela pra sempre.


[]'s

Fontes:

Nenhum comentário: