为什么这段代码等待 1000 毫秒而不是 500 毫秒?

时间:2021-06-06 21:07:51

标签: java multithreading io stream

我不明白这段代码如何打印 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);

1 个答案:

答案 0 :(得分:3)

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

由于我们不知道 PipedOutputstream 的确切缓存或刷新行为,可能test\n 的字节未写入连接的 {{1}在 500 毫秒的等待过程完成后立即执行。相反,它会在稍后的某个时间将第一块数据转发到其连接的接收器。

同样,假设 PipedInputStreamPipedOutputStream 的子类,刷新流将修复此行为。

OutputStream