【问题标题】:Is the general behavior of Flushable.flush() to block until the operation is complete?Flushable.flush() 的一般行为是否会阻塞直到操作完成?
【发布时间】:2016-03-22 05:25:26
【问题描述】:

我们有一个库来缓冲其操作以提高性能。调用者可以调用flush() 方法来强制它开始执行它的操作。

但是现在,flush() 方法的实现方式是它开始异步执行其操作。

也就是说,当调用者调用flush() 方法时,它将开始在不同的线程中执行其操作,而flush() 方法只是返回。

这样,调用者在调用close()方法之前并不知道操作是否完成(他们必须通过检查操作的结果来找到它)。

我想通过阻止flush() 调用来修复它,直到所有操作都完成。

在这样做之前,我想确保 flush() 方法应该阻塞。但是 API 文档没有指定这样的合同。

Flushable.flush() API Doc:

通过将任何缓冲输出写入底层流来刷新此流。

OutputStream.flush() API Doc:

刷新此输出流并强制任何缓冲的输出字节 写出来。 flush 的一般约定是调用它是 指示,如果先前写入的任何字节已被缓冲 输出流的执行,这样的字节应该立即 写到他们的预定目的地。

如果此流的预期目标是提供的抽象 由底层操作系统,例如文件,然后刷新 流仅保证先前写入流的字节 传递给操作系统进行写入;它不保证 它们实际上被写入物理设备,例如磁盘 开车。

OutputStream 的 flush 方法什么都不做。

在输出被写入或不写入之前,这两个文档都没有指定任何关于阻塞的内容。

但是flush()的一般理解是什么,应该是阻塞调用还是不阻塞调用?

【问题讨论】:

  • 请尽量减少粗体字。这只是噪音。它不会添加任何东西,而且会妨碍可读性。
  • 由于OutputStream.flush() 不保证数据会被物理保存,但它确实保证它们被写入底层流,并且这种保证不能在没有阻塞的情况下给出。通常 flush() 块,所以 IMO 你的修复将使 API 遵循大多数程序员的期望。

标签: java asynchronous flush


【解决方案1】:

API 文档没有指定这样的合同。

是的。

两个 Javadoc 引用都来自 OutputStream 系列,它本质上是阻塞所有操作的。如果异步执行,则不能“保证先前写入流的字节被刷新”。

解决方案:不要。

【讨论】:

  • 我希望通过“解决方案:不要。”,您的意思是不要异步执行 flush()。
  • @Codebender 正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
相关资源
最近更新 更多