Java 进程在启动外部进程后不会终止

标签 java windows process asynchronous

在 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/

相关文章:

node.js - 重击 : npm: command not found?

windows - 用户模式应用程序和内核模式驱动程序之间的双向交互?

java - 从泛型类中访问类型 T 的静态方法

java - 为什么 matcher.group 给我一个错误?

java - 随着循环迭代次数的增加,平均运行时间会减少吗?

C:Linux中进程如何通信

C# 代码不会启动程序。未处理 Win32Exception

java - 使用 JodaTime 将本地时间转换为特定国家/地区时间

windows - 在 Windows 上运行 svnserve 的各种方式的经验

python - 如何在 Windows 上安装 pip3?