Я разработал веб-приложение JSP, которое по каждому запросу порождает новый Java-поток. В каждом новом порожденном потоке я создаю процесс с использованием Runtime.exec() и сохраняю объект процесса в переменной экземпляра в потоке. У меня есть требование, в котором я должен убить созданный подпроцесс, а также остановить поток. Итак, я перепробовал метод прерывания в потоке и в переопределенном методе, который я вызываю destroy() на уже сохраненном объекте Process в переменной экземпляра. Ниже приведен код:Убийство Java-процесса началось с потока
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();
}
}
Возможно ли, что illeagal переопределить метод прерывания? Важно, чтобы я убил созданный процесс, прежде чем я прерву поток, который его создает. Я вижу, что поток прерывается, потому что инструкции после waitFor() не выполняются.. Но, однако, destroy() не работает (но получает вызов), и созданный «myprocess.exe» завершает выполнение, даже если я вызываю метод interrupt() до его завершения. Может кто-то, пожалуйста, помогите мне с этим? Что мне не хватает?
Заранее спасибо
Это сработало для меня Кэмерон, спасибо много! –
, но isnt InterruptedException выбрано, только если вызывается метод interrupt(), когда поток находится в состоянии блокировки-ожидания? Это также бросается, когда поток находится в состоянии ожидания? Как в цикле for или while? –
Если вы заняты оживлением, вам нужно проверить 'Thread.interrupted()' самостоятельно. Но почему вы заняты - подождите? Создайте пару потоков демонов, каждый из которых просто прочитает «InputStream» для EOF, а затем умрет. Один для 'subprocess.getInputStream()' и один для 'subprocess.getErrorStream()'. – Jonathan