首先,如果您使用的是 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 的子类,但即使是这样,当您使用 ProcessBuilder 或Runtime.getRuntime().exec()
. 所以你上面的代码行保证抛出一个ClassCastException,假设它没有抛出一些其他异常。
我过去有过一些对方法没有反应的过程的经验destroy()
。这通常是因为进程写入的标准输出或标准错误没有被读取,并且进程已经停止,因为它的一个或多个 I/O 缓冲区已填满。上面的过程是否将任何内容写入其标准输出或标准错误,如果是,您是否正在阅读它?
使用 ProcessBuilder 可以更轻松地同时读取标准输出和标准错误流:如果builder.redirectErrorStream(true);
在上面两行之间添加一行,那么您只需要从进程的标准输出中读取。如果您坚持使用 Java 1.4 或更早版本,并且Runtime.getRuntime().exec()
您必须在两个不同的线程中设置两个不同的对象,一个从每个流中读取。
我不确定你想用你的 ProcessHandler 类实现什么——你还没有提供它的源代码。此外,我从来没有需要比使用该destroy()
方法更强制地杀死一个进程。