Używam procesora Java ProcessBuilder do uruchomienia podprocesu, który jest innym programem Java, który musi działać w oddzielnej maszynie JVM.Podproces uruchamiany z języka Java kończy się za pomocą waitFor, ale strumienie nie są zakończone.
Uruchamiam dwa wątki, aby odczytać strumienie standardowe i stderr z procesu, aby nie było zawieszania się, jeśli bufory strumieniowe są pełne. Wywołanie Process.waitFor zwraca, ale strumienie nie są zakończone.
Kod używam wygląda mniej więcej tak (polecenia jest listą ciągów):
ProcessBuilder pb = new ProcessBuilder(command);
final Process p = pb.start();
final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
final ByteArrayOutputStream errStream = new ByteArrayOutputStream();
Thread outputThread = new Thread() {
@Override
public void run() {
try {
IOUtils.copy(p.getInputStream(), outStream);
} catch (IOException e) {
e.printStackTrace();
}
};
};
outputThread.start();
Thread errorThread = new Thread() {
@Override
public void run() {
try {
IOUtils.copy(p.getErrorStream(), errStream);
} catch (IOException e) {
e.printStackTrace();
}
};
};
errorThread.start();
int returncode = p.waitFor();
outputThread.join();
errorThread.join();
Jeśli uruchomię coś innego, takich jak „java -version” lub „dir”, czy coś, az kodu działa w porządku. Mam dostęp do kodu Java, który próbuję uruchomić, ale nigdy nie słyszałem, aby wywołać metodę close() w System.out.
Możesz być zainteresowany w moim pytaniem o zamknięcie procesu strumieni odpowiednio: http://stackoverflow.com/questions/7065067/how-to-close-std -streams-from-java-lang-process-odpowiedni Kolejny przydatny link: http://mark.koli.ch/2011/01/leaky-pipes-remember-to-close-your-streams-when-using- javas-runtimegetruntimeexec.html –
Jeśli używam 'IOUtils.closeQuietly' lub nawet wywołuję' close() 'na strumieniach przed wywołaniami' join() ', program zawiesza się na tym wywołaniu. –
Jest tak prawdopodobnie dlatego, że 'IOUtils.copy (in, out)' używa 'InputStream.read (byte [])' i to blokuje i czeka na przychodzące dane. Dlatego wątki działają wiecznie i dlatego 'join()' czeka na zawsze. Musisz wymusić zamknięcie tutaj po przekroczeniu określonego czasu. Proszę wypróbować taką implementację, jak ta, którą zamieściłem w mojej odpowiedzi z linku, który ci podałem. Założę się, że da sobie z tym radę. –