繁体   English   中英

由Runtime exec运行时外部程序块

[英]External program blocks when run by 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启动)执行时,vlc程序到达缓冲阶段结束时将挂起。 如果java程序中的所有线程都终止/运行到最后,则vlc程序将进入流传输阶段。 在vlc进程关闭之前,java进程不会终止,因此,此行为显然是进程之间某种耦合的结果。

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

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

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

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

我建议您阅读这篇文章

在第4页上,有一个很好的示例,说明了如何读取线程中的流,以便子进程不会阻塞。

这个网站太棒了:)。 由于某种原因,我认为已经尝试过的一种方法突然开始起作用。

问题是vlc写入其stdErrOut(在提示符下执行时不可见)。 一旦某个输出缓冲区已满,它将阻塞。 一种解决方案是将stdErr重定向到stdOut,然后使线程清空流程对象的输入流。

但是,这不是最佳解决方案,因为我需要大量的外部进程,并且您不能在其输入流上进行非阻塞I / O。 将尝试让计时器服务驱动器空读取多个进程。 非常欢迎提出其他建议,以使过程解耦以避免此问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM