java - 由 Runtime exec 运行时的外部程序 block

标签 java runtime external execute runtime.exec

我正在尝试从 Java 应用程序中启动 VideoLAN 程序的实例。此处显示了我尝试执行此操作的一种方法:

Process p = Runtime.getRuntime().exec("\"C:\\Program Files\\VideoLAN\\VLC\\vlc.exe\" \"http://www.dr.dk/Forms/Published/PlaylistGen.aspx?qid=1316859&odp=true\" :sout=#std{access=udp,mux=ts,dst=127.0.0.1:63928}");

如果我执行上述命令,vlc 程序将启动,并开始流式传输操作(它经历连接、缓冲和流式传输阶段)。

当命令被Runtime exec(或ProcessBuilder start)执行时,vlc程序会在到达缓冲阶段结束时挂起。如果 java 程序中的所有线程都终止/运行到结束,则 vlc 程序将进入流式处理阶段。在vlc进程关闭之前,java进程不会终止,所以这种行为显然是进程之间某种耦合的结果。

尝试通过将命令写入 .cmd 文件然后执行来间接执行命令,但结果相同。

关于如何避免外部进程挂起的任何想法?

最佳答案

嗯,我的猜测是 VLC 填满了您的 STDOUT 缓冲区并卡在 printf 语句中,因为 STDOUT 正在等待该缓冲区清空。

您需要获取流程输出的流并读取它(即使您丢弃它)。

我建议您阅读这篇 article

第 4 页是一个很好的示例,说明如何读取线程中的流,这样您的子进程就不会阻塞。

关于java - 由 Runtime exec 运行时的外部程序 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1850659/

相关文章:

java - 如何使这个接口(interface)作为这个参数的类型在分配给实现该接口(interface)的对象时不抛出 "incompatible types"?

C# Getter-Setter 竞争条件

html - Visual Studio 2010 不链接 CSS 文件

python - 如何使用 Django 模板应用外部 URL

从运行时的角度来看 JavaCV 与 OpenCV

CSS:样式和颜色外部链接

Java数组通过索引方法获取值

java - Spring JAXB - 使用模式验证解码 XML 文档

java - 斯卡拉/ jack 森 : how to deserialize into generic type

java - Runtime.getRuntime() 不在服务器中提供输出