有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

python Java进程执行n秒并打印输出

我有一个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();
        }
    }
}

秒。py文件

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

预期结果: 由于我已将进程waitFor值指定为5秒,因此代码最多只能打印5秒

获得的结果: 代码执行时间超过5秒,最多打印10次

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


共 (1) 个答案

  1. # 1 楼答案

    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();