我们有一个库来缓冲它的操作以提高性能。调用方可以调用flush()方法来强制它开始执行其操作。
但是现在,flush()方法的实现方式是它开始异步地执行它的操作。
也就是说,当调用者调用flush()方法时,它将开始在另一个线程中执行其操作,而flush()方法只是返回。
这样,调用方在调用close()方法之前不知道操作是否完成(他们必须通过检查操作的结果来找到操作)。
我想通过设置flush()调用块来修复它,直到所有操作都完成为止。
在这样做之前,我想确保flush()方法应该被阻塞。但是API文档并没有指定这样的契约。
通过将任何缓冲的输出写入基础流来刷新此流。
刷新此输出流,并强制写入任何缓冲的输出字节。刷新的一般约定是,调用它是一种指示,如果以前写入的任何字节被输出流的实现所缓冲,这些字节应该立即被写入它们的预期目的地。 如果此流的预定目标是底层操作系统(例如文件)提供的抽象,则刷新流只保证将先前写入流的字节传递给操作系统进行写入;它不能保证它们实际上被写入物理设备(例如磁盘驱动器)。 OutputStream的刷新方法不起任何作用。
在写入或不写入输出之前,这两个文档都不指定任何有关阻塞的内容。
但是,对于flush()的一般理解是什么,它应该是阻塞调用还是非阻塞调用?
发布于 2016-03-22 05:54:33
API文档没有指定这样的契约。
是的,确实如此。
Javadoc的引用都来自于OutputStream家族,它本质上阻碍了所有操作。如果异步执行,则不能“保证以前写入流的字节被刷新”。
解决办法:不要。
https://stackoverflow.com/questions/36146741
复制相似问题