我想你已经抛弃了Java包装恰好是别的东西引起巨大的争论在某些稀缺资源的同时运行的可能性?好。
如果你有一个简单的类是这样的:
public class Exec {
public static void main(String[] args) throws Throwable{
class Transfer implements Runnable {
private final InputStream in;
private final OutputStream out;
public Transfer(InputStream i, OutputStream o){
in = i;
out = o;
}
public void run(){
try {
for (int i; (i = in.read()) != -1;) out.write(i);
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Process proc = new ProcessBuilder(args).start();
new Thread(new Transfer(System.in, proc.getOutputStream())).start();
new Thread(new Transfer(proc.getInputStream(), System.out)).start();
new Thread(new Transfer(proc.getErrorStream(), System.err)).start();
System.exit(proc.waitFor());
}
}
...和你比较time perl script.pl insert args here
和time java Exec perl script.pl insert args here
,会发生什么?如果这个世界是理智的,那么它们几乎是同时发生的(除了第二个需要额外的几秒来启动Java),并且如果是这样的话,那么逐步开始调整Exec
类来越来越像你的部署环境,并且看看它何时开始需要很长时间。
如果Exec
上面确实需要更长的时间,开始记录像Perl脚本疯狂,让你看到哪些动作需要较长时间。顺便说一下,也请登录Java包装器,以便了解Perl启动是否需要很长时间。
该脚本是否完成或在一小时后仍在运行?你如何运行脚本?你读过脚本的输出(Process#getInputStream(),Process#getErrorSteam())吗?我想我记得一个进程可能被阻塞,如果它的缓冲区没有被读取。 – sfussenegger 2010-06-01 14:31:19
它在两种情况下运行在相同的硬件上吗? – Zaid 2010-06-01 14:32:04
你如何衡量时间流逝? – LB40 2010-06-01 14:36:48