Flushable.flush()的一般行为是否阻塞直到操作完成?

时间:2016-03-22 05:25:26

标签: java asynchronous flush

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

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

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

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

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

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

Flushable.flush() API Doc:

  

通过将任何缓冲的输出写入基础流来刷新此流。

OutputStream.flush() API Doc:

  

刷新此输出流并强制执行任何缓冲的输出字节   写出来。冲洗的一般合同是称之为   指示,如果先前写入的任何字节已被缓冲   输出流的实现,这样的字节应该立即   写到他们预定的目的地。

     

如果此流的预期目标是提供的抽象   通过底层操作系统,例如文件,然后刷新   流只保证先前写入流的字节   被传递到操作系统进行写入;它不保证   他们实际上写入了一个物理设备,如磁盘   驱动。

     

OutputStream的flush方法不执行任何操作。

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

但对flush()的一般理解是什么,如果它是阻止呼叫?

1 个答案:

答案 0 :(得分:2)

  

API文档未指定类似的合同。

是的。

Javadoc引用都来自OutputStream系列,它本身就阻止了所有操作。如果异步执行,则无法“保证以前写入流的字节被刷新”。

解决方案:不要。