В 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-программы, пока командное окно остается открытым?