2015-06-06 4 views
2

Я запускаю JAR-файл из своего файла java swing с использованием Process proc Runtime.getruntime.exec();, и мне нужно его отключить, чтобы он работал во всех операционных системах.Процесс выключения запускается с помощью Runtime exec();

Я пробовал proc.detroy();, но это не позволяет ему полностью отключиться и вызовет проблемы с программой.

Что мне нужно сделать, чтобы обеспечить безопасное закрытие всех операционных систем?

Я предполагаю, что мне нужно будет проверить, какая ОС используется и обрабатывать каждый отдельно, но что нужно сделать, чтобы обеспечить безопасное закрытие каждого из них?

Вот код StartStop.java:

public class StartStop { 

    static Process proc = null; 

    public void program() { 
     new Thread() { 
      public void run() { 
       try { 
        proc = Runtime.getRuntime().exec("java -jar DEDServer_release.jar"); 

        String res = org.apache.commons.io.IOUtils.toString(new BufferedReader(new InputStreamReader(proc.getErrorStream()))); 
        if(res.contains("Error")){ 
         JOptionPane.showMessageDialog(null, "Failed to start DEDServer. Make sure that this file is in the same directory as DEDServer_release.jar"); 
        } 

       }catch (IOException e) { 
        JOptionPane.showMessageDialog(null, "Failed to start DEDServer. Make sure that this file is in the same directory as DEDServer_release.jar"); 
       } 
      } 
     }.start(); 

    } 

} 

Спасибо за вашу помощь.

+0

JOptionPane должен быть обернут внутри invokeLater, больше читайте в учебнике Oracle Начальная тема – mKorbel

+0

Почему process.destroy() не работает? –

+0

@JPMoresmau В вопросе говорится: «Я пробовал proc.detroy(), но это не позволяет ему полностью отключиться и вызовет проблемы с программой». –

ответ

1

Java8 вводит более мощный API под названием destroyForcibly(), попробуйте использовать его,

ниже документация для того же,

public Process destroyForcibly()

Убивает подпроцесс. Подпроцесс, представленный этим объектом Process, принудительно завершается.

По умолчанию реализация этого метода вызывает destroy() и поэтому не может принудительно завершить процесс. Конкретным реализациям этого класса настоятельно рекомендуется переопределить этот метод с помощью совместимой реализации. Вызов этого метода для объектов процесса, возвращаемых ProcessBuilder.start() и Runtime.exec (java.lang.String), принудительно завершит процесс.

Примечание: Подпроцесс не может быть немедленно прекращен. то есть isAlive() может возвращать true в течение короткого периода после вызова destroyForcibly(). Этот метод может быть прикован к waitFor() при необходимости.

Кроме того, я бы предложил вам взглянуть на этот post для получения дополнительной информации, если destroyForcibly не работает.

+0

Но это дает ту же проблему, что и detroy(). Это будет означать, что другая программа не сможет безопасно завершить работу. –

+0

Да, тогда попробуйте методы, перечисленные в этом сообщении - http://stackoverflow.com/questions/6356340/killing-a-process-using-java – Sathish

+1

Все еще не вижу, как эти помогают ... –

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