2010-05-08 6 views
6

L'application J2SE s'exécute sous Linux. J'ai arrêter le script d'application dans lequel je fais tuer le pid de J2SE. Cette application J2SE a 6 threads utilisateur en cours d'exécution, qui seront interroger pour certains enregistrements spécifiques dans la base de données backend. Lorsque ce pid java est détruit, j'ai besoin d'effectuer des opérations de nettoyage pour chacun des threads longs, comme la connexion à DB et le statut de certaines transactions qui sont en cours à vide.Appel d'une méthode de nettoyage pour le thread utilisateur Java, lorsque JVM arrête le thread

Existe-t-il un moyen d'écrire une méthode dans chaque thread, qui sera appelée lorsque le thread va être arrêté, par JVM.

Répondre

7

Vous pouvez toujours essayer de mettre en place un crochet fermé à l'aide Runtime.addShutDownHook ou encapsulent la longue durée de code dans un try et le nettoyage en finally.

Un exemple minimal faisant à peu près ce que vous voulez faire (mais pour un seul thread de travail pour plus de simplicité).

public class Test extends Thread { 

    static volatile boolean keepRunning = true; 

    public static void main(String[] args) throws InterruptedException { 
     final Thread t = new Test(); 
     t.start(); 
     Runtime.getRuntime().addShutdownHook(new Thread() { 
      public void run() { 
       System.out.println("Shutting down..."); 
       keepRunning = false; 
       t.interrupt(); 
       try { 
        t.join(); 
       } catch (InterruptedException e) { 
       } 
      } 
     }); 
    } 

    public void run() { 
     while (keepRunning) { 
      System.out.println("worknig..."); 
      try { 
       sleep(1000); 
      } catch (InterruptedException e) { 
      } 
     } 

     System.out.println("cleaning up."); 
    } 
} 

sortie lors de la coupure avec Ctrl-C:

worknig... 
worknig... 
worknig... 
^CShutting down... 
cleaning up. 

sortie en tuant avec kill pid

worknig... 
worknig... 
worknig... 
worknig... 
Shutting down... 
cleaning up. 

Sortie en tuant avec kill -9 pid

worknig... 
worknig... 
worknig... 
worknig... 
worknig... 
Killed 

(Aucun nettoyage exécuté.)

+0

Merci pour l'explication détaillée. Le processus Java s'exécute dans le système d'exploitation Linux Red Hat Linux. Et dans mon script stopApplication, j'obtiens le PID du processus java (stocké dans un fichier, au démarrage), et je fais kill -15 (SIGTERM), je dors pendant 40 sec, puis je tue -9 du pid . Je veux juste savoir, quand kill -15 pid est exécuté, le Runtime.addshutdownHook sera-t-il appelé? – user309281

+0

Oui. 'kill -15 PID' donne la même sortie du programme java que la sortie de' kill PID' (voir ci-dessus). – aioobe

Questions connexes