如何在Java中等待进程

如何在Java中等待进程,java,Java,在下面的代码中,我尝试执行一个脚本,这需要相当长的时间才能完成。因此,我已经尝试使用process.waitfor(),但它没有让脚本完成。有什么办法让它工作吗 ProcessBuilder pb = new ProcessBuilder(osShell); Process process = pb.start(); PrintWriter pyCon = new PrintWriter(process.getOutputStream()); pyCon.println("cd " + vide

在下面的代码中,我尝试执行一个脚本,这需要相当长的时间才能完成。因此,我已经尝试使用
process.waitfor()
,但它没有让脚本完成。有什么办法让它工作吗

ProcessBuilder pb = new ProcessBuilder(osShell);
Process process = pb.start();
PrintWriter pyCon = new PrintWriter(process.getOutputStream());
pyCon.println("cd " + videoDir);
System.out.println("Executing python file: "+ command);
pyCon.println(command);
//Here, I need a piece of code which let's my command run in peace              
pyCon.close();

System.out.println(convertStreamToString(process.getInputStream()));
process.waitFor();

通过关闭shell进程的stdin,您几乎告诉它它已经结束了。很可能是shell终止了子python cmd,或者至少没有将python stdout/stderr耗尽或转发到它自己的shell stdout/stderr

尝试等待python命令中的预期结束标记。然后只关闭stdin。当然,从过程中排出所有标准液/标准液


当主线程控制/等待进程时,通常会看到另外两个线程只是从stdout/stderr中抽出字节。请记住,如果不抽出字节,管道可能会填满并阻塞子端,从而阻止它终止。这些管道通常非常小(例如512到2k字节,这显然是可测试的)。

向shell的标准输入发送命令不太可能工作,尤其是在Windows中

在特定目录中执行某些内容的正确方法不是尝试发送
cd
命令,而是:


因为我是新手,你能详细说明一下怎么做吗,因为一个人不能刷新输入流。非常感谢:)从父进程的角度来看,子进程的stdin是一个输出流,因此可以刷新进程stdin(pyCon),而不必立即关闭。至于其余的(用线程输出字节),我通常不提供代码,对不起,这是正确的,但可能不够;我们不知道用户想做什么;也许他需要在一个shell中的不同文件夹中运行不同的命令(顺便说一句,这很容易成为windows上的bash)。
ProcessBuilder pb = new ProcessBuilder("python", pythonFileName);
pb.directory(new File(videoDir));
Process process = pb.start();