我不明白这段代码是如何打印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);
假设PipedOutputStream
是OutputStream
的子类,在给定的代码中,它永远不会被刷新。
由于我们不知道PipedOutputstream
的确切缓存或刷新行为,因此在500ms的等待过程完成后,testn
的字节没有立即写入连接的PipedInputStream
可能会发生。相反,它在稍后的某个点将第一块数据转发到其连接的接收器。
同样,假设PipedOutputStream
是OutputStream
的子类,刷新流将修复这种行为。
try {
Thread.sleep(500);
writer.write("testn".getBytes(StandardCharsets.UTF_8));
writer.flush();
} catch (InterruptedException | IOException ignored) {
}