Java流程执行n秒钟并打印输出

时间:2019-08-20 11:53:30

标签: java python process processbuilder

我有一个python脚本,可下载一个文本文件,逐行读取并将读取的行发送给java。我需要将此操作限制为5秒,然后接收python读取的所有内容。

要测试一切是否正常,我尝试了以下方法:

import java.io.File;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.util.concurrent.TimeUnit;

class ProcessTest {
    public static void main(String args[]) {
        try {
            File file = new File("/home/local/seconds.py");
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String testCase = "", temp = "";
            while ((temp = reader.readLine()) != null) {
                testCase = testCase.concat(temp + '\n');
            }
            reader.close();
            ProcessBuilder pb = new ProcessBuilder("python", "-c", testCase);
            Process p = pb.start();
            if (!p.waitFor(5, TimeUnit.SECONDS)) {
                reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
                while ((temp = reader.readLine()) != null) {
                    System.out.println(temp);
                }
                p.destroy();
                System.out.println("not ended");
            } else {
                System.out.println("ended");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

seconds.py文件

from time import sleep
for i in range(1,11):
    print(i)
    sleep(1)

预期结果: 正如我将过程waitFor的值指定为5秒一样,该代码最多只能打印五个。

获得的结果: 该代码执行超过5秒钟,最多可打印10个。

如何设置进程超时并在缓冲区中打印内容?

1 个答案:

答案 0 :(得分:0)

waitFor在这种情况下不正确。

waitFor不会更改该过程产生的输出量。无论等待多长时间,循环都会消耗该过程可能产生的每一行输出。

因此,在大多数系统上,如果不定期使用其输出,则进程可能会挂起,因此waitFor在与用于打印输出的进程一起使用时可能无法达到预期的效果。

正如其他人指出的那样,p.wait();在这里是不正确的。该方法与过程无关。它是继承的Object.wait方法,用于多个线程之间的协作。

最简单的方法是简单地检查经过时间:

Process p = pb.start();
long startTime = System.currentTimeMillis();
reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((temp = reader.readLine()) != null) {
    long time = System.currentTimeMillis();
    if ((time - startTime) >= 5000) {
        p.destroy();
        System.out.println("not ended");
    }
    System.out.println(temp);
}
if (temp == null) {
    System.out.println("ended");
}
reader.close();
相关问题