我不明白这段代码如何打印 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("test\n".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);
答案 0 :(得分:3)
假设 PipedOutputStream
是 OutputStream
的子类,在给定的代码中它永远不会被刷新。
由于我们不知道 PipedOutputstream
的确切缓存或刷新行为,可能test\n
的字节未写入连接的 {{1}在 500 毫秒的等待过程完成后立即执行。相反,它会在稍后的某个时间将第一块数据转发到其连接的接收器。
同样,假设 PipedInputStream
是 PipedOutputStream
的子类,刷新流将修复此行为。
OutputStream