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
Cela a fonctionné pour moi Cameron, merci beaucoup !! –
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? –
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