代码之家  ›  专栏  ›  技术社区  ›  tangens

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

  •  0
  • tangens  · 技术社区  · 15 年前

    在Windows上,我用 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程序?

    1 回复  |  直到 15 年前
        1
  •  1
  •   ruslan    15 年前

    您可以在知道子进程已完成后(例如,在process.waitfor()返回exit值之后)使用System.exit(0)方法。无论如何,此方法将退出应用程序,而不考虑后台线程。