在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
启动此extenal程序的进程终止( process.waitFor()
返回退出值) . 然后我发送了一个 readerThread.interrupt()
给读者线程,线程终止了 .
但是仍有一个线程正在运行并没有终止 . 这个线程使我的java应用程序保持运行,即使它退出了它的 main
方法 . 使用调试器(eclipse)我无法暂停此线程 . 退出打开的命令窗口后,我的java程序也退出了 .
问题
如何在命令窗口打开时退出我的java程序?
1 回答
在知道子进程完成后(例如,在process.waitFor()返回退出值之后),可以使用System.exit(0)方法 . 无论如何,此方法将退出应用程序而不考虑后台线程 .