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
비교, 무슨 일이? 세계가 정상적인 경우, 두 번째 자바가 시작될 때까지 몇 초가 더 걸리는 것을 제외하고는 같은 시간이 걸릴 것입니다. 그렇다면 점차적으로 Exec
클래스를 배포 환경에 점점 더 비슷하게 적응 시키십시오. , 그리고 그것이 정말로 오랜 시간이 걸리기 시작할 때를보십시오.
위의 경우 이 실제로 더 오래 걸리면 Perl 스크립트에 미친 것처럼 로깅을 시작하십시오. 그러면 어떤 작업이 더 오랜 시간이 걸리는지 알 수 있습니다. 그리고 btw, Java wrapper도 로그인하십시오. 그래서 펄 시작이 정말로 오랜 시간이 걸리는지 알 수 있습니다.
스크립트가 완료되었거나 한 시간이 지나도 계속 실행 중입니까? 스크립트를 어떻게 실행합니까? 스크립트의 출력 (프로세스 # getInputStream(), 프로세스 # getErrorSteam())을 읽으십니까? 버퍼가 읽히지 않으면 프로세스가 차단 될 수 있음을 기억합니다. – sfussenegger
두 경우 모두 동일한 하드웨어에서 실행됩니까? – Zaid
경과 시간은 어떻게 측정합니까? – LB40