2010-01-29 29 views
1

我的代码是这样的:的java一段时间后杀死进程

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

现在我想杀死一秒钟后这一过程中,并得到他的输出和错误到一个字符串变量。

如何做到这一点?

对我而言: 我在编译类Sth中有一个不定式循环。我开始,然后,一秒钟后我想杀了它。

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

THX Tzim

回答

3

这将是一个有点棘手,因为一旦你终止进程,它的输出不再可用,所以你有你杀它之前抢输出。

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

这是假定该过程在此期间本身不关闭。如果确实如此,InputStream将无法使用,并且您希望您一直在阅读数据,而不是旋转拇指。

你一定想让这个异常安全 - 在最后处理程序中调用proc.destroy以确保子进程终止。

+0

如果过程1秒之前关闭本身? – tzim 2010-01-29 02:21:09

+0

显然我让自己不清楚。您的代码不会关闭我的应用程序。在我的例子中,我们正在谈论Sth类中的不定式循环。所以在一秒钟之后,仍然有一个可以吃掉我的CPU的Sth。 – tzim 2010-01-29 02:27:47

+1

@tzim对'proc.destroy'的调用会杀死它。如果这个过程可能会自动关闭,你必须实时获取输出,而不是最后。但是既然你说有一个无限循环,这不应该是一个问题。 – 2010-01-29 02:58:24

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); 
+0

谢谢,我的CMD是一个字符串数组只是一种简化。 – tzim 2010-01-29 02:26:12

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