在 Windows 上,我使用 ProcessBuilder
启动了一个程序“async.cmd”,如下所示:
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 应用程序保持运行。使用调试器(eclipse)我无法暂停这个线程。当我退出打开的命令窗口后,我的java程序也退出了。
问题
如何在命令窗口保持打开状态时退出 java 程序?
最佳答案
在知道子进程完成后(例如在 process.waitFor() 返回退出值之后),您可以使用 System.exit(0) 方法。无论如何,此方法都会退出应用程序,而不考虑后台线程。
关于Java 进程在启动外部进程后不会终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2731749/