【发布时间】:2016-03-22 05:25:26
【问题描述】:
我们有一个库来缓冲其操作以提高性能。调用者可以调用flush() 方法来强制它开始执行它的操作。
但是现在,flush() 方法的实现方式是它开始异步执行其操作。
也就是说,当调用者调用flush() 方法时,它将开始在不同的线程中执行其操作,而flush() 方法只是返回。
这样,调用者在调用close()方法之前并不知道操作是否完成(他们必须通过检查操作的结果来找到它)。
我想通过阻止flush() 调用来修复它,直到所有操作都完成。
在这样做之前,我想确保 flush() 方法应该阻塞。但是 API 文档没有指定这样的合同。
通过将任何缓冲输出写入底层流来刷新此流。
刷新此输出流并强制任何缓冲的输出字节 写出来。 flush 的一般约定是调用它是 指示,如果先前写入的任何字节已被缓冲 输出流的执行,这样的字节应该立即 写到他们的预定目的地。
如果此流的预期目标是提供的抽象 由底层操作系统,例如文件,然后刷新 流仅保证先前写入流的字节 传递给操作系统进行写入;它不保证 它们实际上被写入物理设备,例如磁盘 开车。
OutputStream 的 flush 方法什么都不做。
在输出被写入或不写入之前,这两个文档都没有指定任何关于阻塞的内容。
但是flush()的一般理解是什么,应该是阻塞调用还是不阻塞调用?
【问题讨论】:
-
请尽量减少粗体字。这只是噪音。它不会添加任何东西,而且会妨碍可读性。
-
由于
OutputStream.flush()不保证数据会被物理保存,但它确实保证它们被写入底层流,并且这种保证不能在没有阻塞的情况下给出。通常flush()块,所以 IMO 你的修复将使 API 遵循大多数程序员的期望。
标签: java asynchronous flush