2010-11-09 2 views
1

Я разработал веб-приложение 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() до его завершения. Может кто-то, пожалуйста, помогите мне с этим? Что мне не хватает?

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

ответ

5

Это не запрещено переопределять 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 есть инструменты, чтобы сделать это одним слоем, иначе это довольно простой способ написать себя.

+0

Это сработало для меня Кэмерон, спасибо много! –

+0

, но isnt InterruptedException выбрано, только если вызывается метод interrupt(), когда поток находится в состоянии блокировки-ожидания? Это также бросается, когда поток находится в состоянии ожидания? Как в цикле for или while? –

+0

Если вы заняты оживлением, вам нужно проверить 'Thread.interrupted()' самостоятельно. Но почему вы заняты - подождите? Создайте пару потоков демонов, каждый из которых просто прочитает «InputStream» для EOF, а затем умрет. Один для 'subprocess.getInputStream()' и один для 'subprocess.getErrorStream()'. – Jonathan

Смежные вопросы