为什么这个代码等待1000ms而不是500ms



我不明白这段代码是如何打印1000而不是500的。我有什么东西不见了吗?

PipedOutputStream writer = new PipedOutputStream();
PipedInputStream reader = new PipedInputStream();
writer.connect(reader);
BufferedReader stream = new BufferedReader(new InputStreamReader(reader));
ScheduledExecutorService thread = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryBuilder().build());
thread.schedule(() -> {
try {
Thread.sleep(500);
writer.write("testn".getBytes(StandardCharsets.UTF_8));
} catch (InterruptedException | IOException ignored) {
}
}, 0, TimeUnit.MILLISECONDS);
long startTime = System.currentTimeMillis();
stream.readLine();
long duration = System.currentTimeMillis() - startTime;
System.out.println(duration);

假设PipedOutputStreamOutputStream的子类,在给定的代码中,它永远不会被刷新。

由于我们不知道PipedOutputstream的确切缓存或刷新行为,因此在500ms的等待过程完成后,testn的字节没有立即写入连接的PipedInputStream可能会发生。相反,它在稍后的某个点将第一块数据转发到其连接的接收器。

同样,假设PipedOutputStreamOutputStream的子类,刷新流将修复这种行为。

try {
Thread.sleep(500);
writer.write("testn".getBytes(StandardCharsets.UTF_8));
writer.flush();
} catch (InterruptedException | IOException ignored) {
}

相关内容

最新更新