首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一段时间后被ProcessBuilder阻塞的Java应用程序

一段时间后被ProcessBuilder阻塞的Java应用程序
EN

Stack Overflow用户
提问于 2013-05-30 13:49:20
回答 1查看 2.5K关注 0票数 3

我正在开发一个包含3个按钮的Java桌面应用程序(我们称之为控制台):其中两个按钮启动一个Win32应用程序;第三个按钮应该启动一个可执行jar:

代码语言:javascript
复制
ProcessBuilder pb = new ProcessBuilder("java", "-jar", testDrivePath);
Process process = pb.start();

其中testDrivePath是jar的路径(类似于"C:\Programs\TestDrive.jar")

TestDrive.jar应用程序正确启动,但过了一段时间它就会阻塞,无法进行任何操作。

如果我关闭控制台,TestDrive.jar将恢复工作!

如果我单独启动TestDrive.jar (没有从控制台调用它),那么一切都是正确的。

有人能告诉我吗?

EN

回答 1

Stack Overflow用户

发布于 2013-05-30 13:53:52

您可能需要从流程读取输出流。您可以获得这样的stdout和stderr流:

代码语言:javascript
复制
InputStream stdout = process.getInputStream();
InputStream stderr = process.getErrorStream();

您可以创建工作线程来异步读取这些流。

代码语言:javascript
复制
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的实现,它使用流的输出。

代码语言:javascript
复制
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 );
            }
        }
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16838039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档