2014-02-04 7 views
1

Я реализую программу для компиляции и запуска других приложений. Мне было интересно, есть ли способ закончить программу, когда мое приложение обнаруживает, что есть проблема, например. бесконечная петля. Я попытался использовать process.Destroy(), но он убивает CMD не ту настоящую программу, которая имеет бесконечный цикл ...Как остановить выполнение программы с использованием другой программы Java

Ваша помощь очень ценится.

Вот часть моего кода:

synchronized (pro) { 
      pro.wait(30000); 
    } 

    try{ 
     pro.exitValue(); 

     }catch (IllegalThreadStateException ex) 
     { 

      pro.destroy(); 
      timeLimitExceededflag = true; 
      System.out.println("NOT FINISHED123"); 
      System.exit(0); 


     } 

    } 

В основном я делаю мое приложение для вызова ЦМД с помощью ProcessBuilder. Этот код завершает CMD, но если он запускает программу с бесконечным циклом, приложение будет работать, что скажется на производительности моих серверов.

+0

Являются ли ваши вопросы, связанные с параллелизмом (например, тупики?) –

+0

Может быть, это поможет: http://stackoverflow.com/questions/15095819/how-to-kill-runtime-exec – Janos

+0

Нет моей проблемы в том, что process.destroy завершает CMD, а не ту программу, которая имеет бесконечный цикл. – user2597012

ответ

0

Я бы предложил использовать следующее решение:

  1. начать программу с названием указано
  2. получить PID процесса с помощью команды «TaskList». Требуется парсер CSV. Есть много доступных я считаю, например org.apache.commons.csv.CSVParser и т. Д. :)
  3. убить процесс командой taskkill с помощью PID.

Вот некоторая часть кода, которая может быть полезна:

public static final String   NL = System.getProperty("line.separator", "\n"); 

public <T extends Appendable> int command(String... cmd) throws Exception { 
    return command(null, cmd); 
} 

public <T extends Appendable> int command(T out, String... cmd) throws Exception { 
    try { 

     final ProcessBuilder pb = new ProcessBuilder(cmd); 

     pb.redirectErrorStream(true); 

     final Process proc = pb.start(); 
     final BufferedReader rd = new BufferedReader(new InputStreamReader(proc.getInputStream())); 

     for (;;) { 
      final String line = rd.readLine(); 

      if (line == null) { 
       break; 
      } 

      if (out != null) { 
       out.append(line); 
       out.append(NL); 
      } 
     } 

     return proc.waitFor(); 

    } catch (InterruptedException e) { 
     throw new IOException(e); 
    } 
} 

public void startProcessWithTitle(String pathToExe, String title) throws Exception { 
    command("cmd.exe", "/C", "start", '"' + pathToExe + '"', '"' + title + '"', ..cmd.params..); 
} 

public int findProcessByTitle(String title) throws Exception { 

    final StringBuilder list = new StringBuilder(); 

    if (command(list, "tasklist", "/V", "/FO", "csv") != 0) { 
     throw new RuntimeException("Cannot get tasklist. " + list.toString()); 
    } 

    final CSVReader csv = new CSVReader(new StringReader(list.toString()), ',', true, "WindowsOS.findProcessByTitle"); 
    csv.readHeaders(true); // headers 

    int pidIndex = csv.getHeaderIndex("PID"); 
    int titleIndex = csv.getHeaderIndex("Window Title"); 

    while (csv.nextLine()) { 
     final String ttl = csv.getString(titleIndex, true); 
     if (ttl.contains(title)) { 
      return csv.getInt(pidIndex);     
     } 
    } 

    Utils.close(csv); 

    return -1; 
} 

public boolean killProcess(int pid) throws Exception { 
    return command("taskkill", "/T", "/F", "/PID", Integer.toString(pid)) == 0; 
}