многопоточность Java с использованием Process.waitFor () и java.lang.InterruptedException - PullRequest
0 голосов
/ 17 февраля 2012

Это псевдокод того, что я делал:

ProcessBuilder processBuilder = new ProcessBuilder(cmdToExecute);
    Process process = processBuilder.start();
    StreamGobbler errorGobbler = new StreamGobbler(process.getErrorStream(), "ERROR");
    StreamGobbler outStreamGobbler = new StreamGobbler(process.getInputStream(), "OUTPUT");

    errorGobbler.start();
    outStreamGobbler.start();
    int exitValue = process.waitFor();
    process.destroy();

Я получаю InterruptedException при использовании

Process.waitFor ()

команда. Было хорошо, когда это было однопоточное Java-приложение. Но теперь это многопоточное приложение, я получаю

java.lang.InterruptedException

на этой конкретной линии. Документ Java говорит:

Броски: InterruptedException - если текущий поток прерывается другим потоком, пока он ожидает, тогда ожидание закончено и InterruptedException выбрасывается

Я понимаю, что это значит, потому что один поток может ожидать, в то время как другой тоже хочет ждать, но как мне преодолеть это исключение, и я также смогу использовать waitFor ().

Любая помощь оценивается. Я не нашел необходимости публиковать код, но дайте мне знать, если вам, ребята, это нужно.

Код для ExecutorService:

while(...){
                          .......
        execServ.execute(...);
    }
    execServ.shutdown();
            while(!execServ.isTerminated()){
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
                }

1 Ответ

1 голос
/ 17 февраля 2012

Я не уверен, что вы понимаете, что означает Javadoc. Это говорит о том, что если какой-то другой поток вызывает interrupt() в потоке, который выполняет код, который вы опубликовали до или во время его вызова waitFor(), будет выдано InterruptedException. Это не имеет никакого отношения к двум потокам, ожидающим чего-то одновременно.

Ваша программа явно вызывает interrupt() где-нибудь? Или вы выполняете этот процесс через ExecutorService? При отмене задания, переданного исполнителю, оно может быть прервано.

...