繁体   English   中英

一段时间后杀死Java

[英]java killing process after a period of time

我的代码是这样的:

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

现在,我想在一秒钟后终止此过程,并将其输出和错误转换为字符串变量。

怎么做 ?

就我而言:我在编译类Sth中有一个不定式循环。 我正在启动它,然后一秒钟后我想杀死它。

//我正在Win XP,然后是Debian上对其进行测试。

蒂兹

这将有点棘手,因为一旦终止该进程,其输出将不再可用,因此您必须在终止它之前先获取该输出。

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

这是假设该过程在此期间不会自行关闭。 如果是这样,InputStream将无法使用,并且您希望自己一直在读取数据,而不是不停地摇晃手指。

您一定要使此异常安全- proc.destroy的调用放在一个finally处理程序中,以确保终止子进程。

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

(您的cmd中有一个错字,您写的是“ = Xms2M”而不是“ -Xms2M”,与“ -Xmx16M”相同)。

永远不要这样调用Runtime.exec:您必须将“ c​​md”分割成一个数组,否则会遇到很多问题。 像这样做:

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

这也可以帮助您:

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();
        }
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM