Процесс Java не завершается после запуска внешнего процесса - PullRequest
0 голосов
/ 28 апреля 2010

В Windows я запустил программу "async.cmd" с ProcessBuilder, например:

ProcessBuilder processBuilder = new ProcessBuilder( "async.cmd" );
processBuilder.redirectErrorStream( true );
processBuilder.start();

Затем я читаю вывод процесса в отдельном потоке, например:

byte[] buffer = new byte[ 8192 ];
while( !interrupted() ) {
    int available = m_inputStream.available();
    if( available == 0 ) {
        Thread.sleep( 100 );
        continue;
    }

    int len = Math.min( buffer.length, available );
    len = m_inputStream.read( buffer, 0, len );
    if( len == -1 ) {
        throw new CX_InternalError();
    }
    String outString = new String( buffer, 0, len );
    m_output.append( outString );
}

Теперь случилось так, что содержимое файла "async.cmd" было таким:

REM start a command window 
start cmd /k

Процесс, который запустил эту программу экстенала, завершился (process.waitFor() вернул значение выхода). Затем я отправил readerThread.interrupt() в ветку читателя, и нить также прервалась.

Но все еще был запущенный поток, который не завершался. Этот поток поддерживал выполнение моего java-приложения даже при выходе из его метода main. С отладчиком (затмением) я не смог приостановить эту тему. После того, как я вышел из открытого командного окна, моя java-программа также закрылась.

Вопрос

Как мне выйти из Java-программы, пока командное окно остается открытым?

1 Ответ

1 голос
/ 28 апреля 2010

Вы можете использовать метод System.exit (0) после того, как узнаете, что дочерний процесс завершен (например, после того, как process.waitFor () вернул значение выхода). Этот метод в любом случае выйдет из приложения безотносительно к фоновым потокам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...