2010-11-09 34 views
1

J'ai développé une application web JSP qui, à chaque requête, génère un nouveau thread Java. Dans chaque thread nouvellement créé, je crée un processus en utilisant Runtime.exec() et stocke l'objet de processus dans une variable d'instance dans le thread. J'ai une exigence dans laquelle je dois tuer le sous-processus créé et également arrêter le fil. Ainsi, j'ai surpassé la méthode d'interruption dans le thread et dans la méthode substituée que j'appelle destroy() sur un objet Process déjà stocké dans la variable d'instance. Le code suivant est:Tuer un processus Java démarré à partir d'un thread

public class MyThread extends Thread { 
    private Process subprocess; 

    @Override 
    public void run() { 
     subprocess = Runtime.getRuntime().exec("myprocess.exe"); 
     subprocess.waitFor(); 
     /* 
      Some more statements 
     */ 
    } 

    @Override 
    public void interrupt() { 
     if(subprocess!=null) { 
      System.out.println("Destroying Process"); 
      subprocess.destroy(); 
     } 
     super.interrupt(); 
    } 
} 

Est-il illeagal de surcharger la méthode d'interruption? Il est important que je tue le processus créé avant d'interrompre le thread qui le crée. Je vois que le fil est interrompu parce que les instructions après waitFor() ne sont pas exécutées. Mais, cependant, destroy() ne fonctionne pas (mais est appelé) et le "myprocess.exe" créé termine l'exécution même si j'appelle la méthode interrupt() avant son achèvement. Quelqu'un pourrait-il m'aider avec ça? Qu'est-ce que je rate?

Merci à l'avance

Répondre

5

Il n'est pas illégal de passer outre interrupt, mais je ne le recommanderais pas. Peut-être un propre façon de le faire serait:

public class MyThread extends Thread { 
    private Process subprocess; 

    @Override 
    public void run() { 
     subprocess = Runtime.getRuntime().exec("myprocess.exe"); 
     try { 
      subprocess.waitFor(); 
     } 
     catch (InterruptedException e) { 
      subprocess.destroy(); 
     } 
     /* 
      Some more statements 
     */ 
    } 
} 

N'oubliez pas que vous devez également extraire des données à partir des flux de sortie subprocess/erreur, sinon vous pourriez liquider avec des tampons complets et un sous-processus bloqué. C'est OK pour lire ces flux et rejeter les données. Je soupçonne que le paquet commons-io a des outils pour en faire un one-liner, sinon c'est une méthode assez simple pour vous écrire.

+0

Cela a fonctionné pour moi Cameron, merci beaucoup !! –

+0

mais n'est pas InterruptedException levée uniquement si la méthode interruption() est appelée lorsque le thread est en attente de blocage? Est-il également jeté quand le fil est sous occupé-attente? Comme dans une boucle for ou while? –

+0

Si vous êtes occupé, vous devez tester vous-même Thread.interrupted() '. Mais pourquoi voudriez-vous attendre? Apparition de deux threads de démon qui lisent chacun un 'InputStream' à EOF, puis meurent. Un pour 'subprocess.getInputStream()' et un pour 'subprocess.getErrorStream()'. – Jonathan