Уничтожение процесса Java, запущенного из потока - PullRequest
1 голос
/ 09 ноября 2010

Я разработал веб-приложение JSP, которое при каждом запросе порождает новый поток Java.В каждом вновь порожденном потоке я создаю Process с помощью Runtime.exec () и сохраняю объект процесса в переменной экземпляра в потоке.У меня есть требование, в котором я должен убить созданный подпроцесс, а также остановить поток.Итак, я переопределил метод прерывания в потоке и в переопределенном методе, который я вызываю destroy () для уже сохраненного объекта Process в переменной экземпляра.Ниже приведен код:

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();
    }
}

Необязательно ли переопределять метод прерывания?Важно, чтобы я уничтожил созданный процесс, прежде чем прерывать поток, который его создает.Я вижу, что поток действительно прерывается, потому что операторы после waitFor () не выполняются .Но, однако, destroy () не работает (но вызывается), и созданный «myprocess.exe» завершает выполнение, даже если я вызываю метод interrupt () до его завершения.Может кто-нибудь помочь мне с этим?Чего мне не хватает?

Заранее спасибо

1 Ответ

5 голосов
/ 09 ноября 2010

Недопустимо переопределять interrupt, но я бы не советовал. Возможно, более чистый способ сделать это будет:

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
        */
    }
}

Не забывайте, что вы также должны извлекать данные из потоков вывода / ошибок подпроцесса, иначе вы можете получить полные буферы и заблокированный подпроцесс. Можно читать из этих потоков и отбрасывать данные. Я подозреваю, что в пакете commons-io есть инструменты, чтобы сделать его однострочным, в противном случае это довольно простой способ написать самостоятельно.

...