尝试制作一个可以TSKILL自己的过程

时间:2010-09-12 07:20:59

标签: java multithreading process instance classcastexception

所以我对正在运行的进程有问题,每当我尝试使用process.destroy()停止它时,它都不会停止。

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

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

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

任何人都知道如何才能使这些兼容。 BTW exec(String)命令返回Process的实例。

2 个答案:

答案 0 :(得分: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()时,JVM也无法返回它的实例。所以上面的代码行保证抛出ClassCastException,假设它没有抛出其他异常。

我在过去没有回应destroy()方法的过程中有过一些经验。通常这是因为没有读取由该过程写入的标准输出或标准错误,并且由于其一个或多个I / O缓冲区已经填满,该过程已经停止。上面的过程是否将任何内容写入其标准输出或标准错误,如果是,您是否正在阅读它?

使用ProcessBuilder可以更轻松地读取标准输出和标准错误流:如果在上面两行之间添加行builder.redirectErrorStream(true);,那么您只需要读取流程的标准输出。如果您坚持使用Java 1.4或更早版本以及Runtime.getRuntime().exec(),则必须在两个不同的线程中设置两个不同的对象,一个从每个流中读取。

我不确定您要使用ProcessHandler类实现什么 - 您还没有提供它的源代码。此外,我从来没有必要比使用destroy()方法更强行地杀死进程。

答案 1 :(得分:0)

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