Во-первых, если вы используете Java 5 или новее, я бы рекомендовал использовать ProcessBuilder вместо Runtime.getRuntime().exec()
.Во-первых, вам не нужно беспокоиться о цитировании аргументов.Каждый отдельный аргумент командной строки является отдельным параметром.Например:
ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/C", "java net/com/codeusa/Server 43594");
Process process = builder.start();
При запуске процесса с использованием ProcessBuilder или Runtime.getRuntime().exec()
JVM целиком и полностью создает и возвращает подкласс Process по своему выбору, и нет способа повлиять на его решение.Я предполагаю, что ваш класс ProcessHandler - это тот, который вы написали сами (я не могу найти класс Java API с таким именем).Он может быть подклассом Process, но даже если это не так, JVM не может вернуть его экземпляр, когда вы используете ProcessBuilder или Runtime.getRuntime().exec()
.Таким образом, приведенная выше строка кода гарантирует исключение ClassCastException, при условии, что оно не вызывает каких-либо других исключений.
В прошлом у меня был некоторый опыт процессов, которые не реагировали на методы destroy()
.Обычно это происходило из-за того, что стандартный вывод или стандартная ошибка, записываемая процессом, не читались, и процесс остановился из-за того, что один или несколько его буферов ввода / вывода были заполнены.Записывает ли процесс выше что-либо в свой стандартный вывод или стандартную ошибку, и если да, вы читаете это?
Считать как стандартный вывод, так и стандартные потоки ошибок проще с ProcessBuilder: если вы добавите строку builder.redirectErrorStream(true);
между двумя вышеупомянутыми строками, вам нужно только читать из стандартного вывода процесса.Если вы застряли на Java 1.4 или более ранней версии и Runtime.getRuntime().exec()
, вам придется настроить два разных объекта в двух разных потоках, по одному для чтения из каждого потока.
Я не уверен, что выпытаетесь достичь с помощью класса ProcessHandler - вы не предоставили исходный код для него.Кроме того, у меня никогда не было необходимости убивать процесс более принудительно, чем с помощью метода destroy()
.