在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
方法。使用调试器(eclipse)我无法暂停此线程。退出打开的命令窗口后,我的java程序也退出了。
如何在命令窗口打开时退出我的java程序?
答案 0 :(得分:1)
在知道子进程完成后(例如,在process.waitFor()返回退出值之后),可以使用System.exit(0)方法。无论如何,此方法将退出应用程序而不考虑后台线程。