我的python代码在java中给出了一个真正的循环打印,但是如果我进入睡眠状态则不会打印,即使在睡眠持续时间之后,java中也没有输出
print 33
import time
while True:
i = 0
time.sleep(0.01)
j = 0
print 1
这是python代码。我从java代码
运行它public class DistanceHandler extends Thread
{
private Process p;
private ProcessBuilder pb;
private BufferedReader bfr;
public DistanceHandler()
{
try{
/*pb = new ProcessBuilder("python", "/home/pi/Distance.py");
pb.redirectErrorStream(true);
pb.
p = pb.start();
bfr = new BufferedReader(new InputStreamReader(p.getInputStream()));*/
p = Runtime.getRuntime().exec("sudo python /home/pi/test.py -u");
bfr = new BufferedReader(new InputStreamReader(p.getInputStream()));
} catch (Exception e) {
System.out.println(e);
}
}
public void run(){
System.out.println("Start read");
if(p != null) {
System.out.println("P alive: " + p.isAlive());
int line = 0;
try {
while ((line = bfr.read()) != -1) {
//display each output line form python script
System.out.println((char)line);
if(line < 10){
System.out.println("Pop that Ballooon ");
}
}
} catch (Exception e) {
System.out.println(e);
}
}
}
}
答案 0 :(得分:0)
这是一个常见问题。 Python(和C,就此而言)流是buffered。
在您的情况下,这意味着dashboardView
不必导致立即输出,而是填充流的输出缓冲区。
程序的Java端只会在缓冲区已满后接收一次数据(然后是完整的缓冲区,这正是缓冲区的用途:避免小规模IO的系统调用)。现在,由于默认缓冲区大小通常为8,192字节,并且假设print
为每个循环写入2个字节(print 1
),缓冲区将需要超过40秒才能填充。因此,看起来Java程序可能没有输入,而实际上我们只是在等待Python端的输出缓冲区来填充。
如果删除'1\n'
,则尽可能快地填充缓冲区,导致几乎立即写入。
您可以强制流刷新缓冲区以避免此问题:
sleep()