我正在开发一个包含3个按钮的Java桌面应用程序(我们称之为控制台):其中两个按钮启动一个Win32应用程序;第三个按钮应该启动一个可执行jar:
ProcessBuilder pb = new ProcessBuilder("java", "-jar", testDrivePath);
Process process = pb.start();其中testDrivePath是jar的路径(类似于"C:\Programs\TestDrive.jar")
TestDrive.jar应用程序正确启动,但过了一段时间它就会阻塞,无法进行任何操作。
如果我关闭控制台,TestDrive.jar将恢复工作!
如果我单独启动TestDrive.jar (没有从控制台调用它),那么一切都是正确的。
有人能告诉我吗?
发布于 2013-05-30 13:53:52
您可能需要从流程读取输出流。您可以获得这样的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 );
}
}
}
}https://stackoverflow.com/questions/16838039
复制相似问题