由Runtime exec运行时的外部程序块

Jan*_*ick 3 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}");
Run Code Online (Sandbox Code Playgroud)

如果我执行上述命令,将启动vlc程序,并将启动流操作(它通过连接,缓冲然后流式传输).

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

尝试通过将命令写入.cmd文件然后执行它来间接执行命令,但会导致相同的行为.

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

kar*_*rts 7

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

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

我建议你阅读这篇文章

在第4页是一个很好的例子,说明如何读取线程中的流,以便您的子进程不会阻塞.