java一段时间后的查杀过程

时间:2010-01-29 01:44:25

标签: java process

我的代码是这样的:

        Runtime rt = Runtime.getRuntime();
        // cmd == "cmd.exe /C java =Xms2M =Xmx16M Sth" 
        Process proc = rt.exec(cmd);

现在我想在一秒钟之后终止这个过程,并将他的输出和错误输入到字符串变量中。

怎么做?

在我的情况下: 我在编译类Sth中有一个不定式循环。我开始它然后,一秒后我想杀了它。

//我在Win XP和Debian上测试它。

THX Tzim

4 个答案:

答案 0 :(得分:3)

这会有点棘手,因为一旦你终止进程,它的输出就不再可用了,所以你必须在杀掉它之前抓住输出。

Thread.sleep(1000); 
InputStream in = proc.getInputStream();
byte[] data = new byte[in.available()];
in.read(data);
proc.destroy();

这假设该过程在此期间不会自行关闭。如果是这样,InputStream将无法使用,您希望您一直在阅读数据,而不是歪拇指。

您肯定希望使此异常安全 - 将调用proc.destroy放在finally处理程序中以确保子进程终止。

答案 1 :(得分:3)

Runtime rt = Runtime.getRuntime();
// cmd == "cmd.exe /C java =Xms2M =Xmx16M Sth" 
Process proc = rt.exec(cmd);

(您的cmd中有拼写错误,您写的是“= Xms2M”而不是“-Xms2M”,“-Xmx16M”也是如此。)

永远不要像这样调用Runtime.exec:你必须在数组中拆分'cmd',否则你会遇到很多问题。这样做:

String[] sar = { "cmd.exe", "/C", "java", "-Xms2M", "-Xmx16M", "Sth" };
Runtime.getRuntime().exec( sar );

答案 2 :(得分:1)

您可以使用ProcessBuilder返回Process对象并使用它的destroy()方法。

Example

答案 3 :(得分:1)

这也可以帮助你:

private static String runCommand(boolean debug, String... script) throws IOException, InterruptedException {
    Runtime rt = Runtime.getRuntime();
    Process process = rt.exec(script);
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new InputStreamReader(process.getInputStream(), StreamReaderUtil.UTF8));
        Thread.sleep(1000);
        StringBuilder queryExe = new StringBuilder();
        try {
            String str;
            while(reader.ready() && (str = reader.readLine()) != null) {
                queryExe.append(str).append("\n");
            }
        } catch(IllegalThreadStateException e) {
            Thread.sleep(250);
        }
        // FIXME: Replace with a Logger
        if(debug) {
            System.out.println("Executing : " + script);
            System.out.println("Result    : " + queryExe);
        }
        return queryExe.toString();
    } finally {
        if(process != null) {
            process.destroy();
        }
        if(reader != null) {
            reader.close();
        }
    }
}