0

因此,我正在运行的进程出现问题,每当我尝试使用 process.destroy() 停止它时,它都不会停止。

我想创建一个扩展 Process 的文件(ProcessHandler)并执行以下操作:

ProcessHandler process = (ProcessHandler)Runtime.getRuntime().exec("cmd.exe /c \"java net/com/codeusa/Server 43594\"");

所以,我的问题是试图将 Process 转换为 ProcessHandler ,我可以在其中覆盖 destroy() 命令,使其本身成为 TSKILL 。我已经想出了如何做所有事情,但是当我尝试上面的代码时,我得到了一个 ClassCastException ..

任何人都知道如何使它们兼容。顺便说一句,exec(String) 命令返回一个 Process 实例。

4

2 回答 2

0

首先,如果您使用的是 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()方法更强制地杀死一个进程。

于 2010-09-12T09:23:52.747 回答
0

我发现了一个全新的东西!当我为进程调用destroy()方法时,它会破坏cmd.exe进程..但是我用“java”替换了cmd.exe,现在当我调用destroy()时,java.exe进程终止.. HURAY

于 2010-09-13T09:44:57.350 回答