3

3 つのボタンを含む Java デスクトップ アプリケーション (コンソールと呼びましょう) を開発しています。そのうちの 2 つは Win32 アプリケーションを起動します。3 番目は、実行可能な jar を起動する必要があります。

ProcessBuilder pb = new ProcessBuilder("java", "-jar", testDrivePath);
Process process = pb.start();

ここで、testDrivePathは jar へのパスです (「C:\Programs\TestDrive.jar」のようなもの)。

TestDrive.jar アプリケーションは正しく起動しますが、しばらくするとブロックされ、操作を行うことができなくなります。

コンソールを閉じると、TestDrive.jar は再び機能します。

TestDrive.jar をスタンドアロンとして (コンソールから呼び出さずに) 起動すると、すべてが正しくなります。

誰でもアドバイスできますか?

4

1 に答える 1

4

プロセスから出力ストリームを読み取る必要がある可能性があります。次のように stdout および stderr ストリームを取得できます。

InputStream stdout = process.getInputStream();
InputStream stderr = process.getErrorStream();

これらのストリームから非同期的に読み取るワーカー スレッドを作成できます。

Thread threadOut = new Thread( new MyInputStreamSink( stdout, "out" ));
Thread threadErr = new Thread( new MyInputStreamSink( stderr, "err" ));

threadOut.setDaemon(true);
threadErr.setDaemon(true);
threadOut.setName( String.format("stdout reader" ));
threadErr.setName( String.format("stderr reader" ));

threadOut.start();
threadErr.start();

ストリームからの出力を消費する Runnable の実装を次に示します。

private static class MyInputStreamSink implements Runnable {
    private InputStream m_in;
    private String m_streamName;

    MyInputStreamSink( InputStream in, String streamName ) {
        m_in = in;
        m_streamName = streamName;
    }

    @Override
    public void run() {
        BufferedReader reader = null;
        Writer writer = null;

        try {
            reader = new BufferedReader( new InputStreamReader( m_in ) );

            for ( String line = null; ((line = reader.readLine()) != null); ) {
                // TODO: Do something with the output, maybe.
            }
        } catch (IOException e) {
            s_logger.log( Level.SEVERE, "Unexpected I/O exception reading from process.", e );
        }
        finally {
            try {
                if ( null != reader ) reader.close();
            }
            catch ( java.io.IOException e ) {
                s_logger.log( Level.SEVERE, "Unexpected I/O exception closing a stream.", e );
            }
        }
    }
}
于 2013-05-30T13:53:52.977 に答える