【发布时间】:2021-08-24 01:42:55
【问题描述】:
我不明白这段代码如何打印 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);
【问题讨论】:
-
假设
PipedOutputStream是OutputStream的子类,在给定的代码中它永远不会被刷新,这可能会在第二次调度任务时隐式发生,导致等待时间为1000毫秒在BufferedReader实际接收到一些输入之前。 -
@Izruo 就是这样,冲洗作家解决了这个问题。虽然这不是 scheduleAtFixedRate 只是调度所以任务不会运行两次。你能把这个写成答案让我接受吗?
-
我不确定您为什么期望
stream.readline()的时间为 500 毫秒。您是否希望readLine()阻塞与预定线程完成的时间一样长?假设您在写入后刷新,那么duration将 至少 但可能超过 500 毫秒。我希望您不要依赖duration来获得特定的值范围。
标签: java multithreading io stream