我可以理解网络应用程序使用复用技术(以避免创建太多线程),以及程序使用异步调用进行流水线处理(更高效)。但我不理解异步文件通道的效率目的。
有任何想法吗?
read()
方法返回一个Future
对象,以获取从文件中读取数据的结果。因此,您可以调用read()
,它会立即返回一个Future
对象。在后台,另一个线程将从文件中读取实际数据。您自己的线程可以继续做其他事情,当需要读取数据时,可以在Future
对象上调用get()
。这将返回数据(如果后台线程尚未完成读取数据,则使您的线程阻塞,直到数据准备好)。这样做的优点是您的线程不必等待整个读取操作的时间;它可以在真正需要数据之前做一些其他事情。AsynchronousFileChannel
是Java SE 7中的一个新类,该版本尚未发布。FileChannel
实现了InterruptibleChannel
,因此它以及使用它的任何东西(例如通过Files.newOutputStream()
返回的OutputStream
)都有不幸的行为[1][2],即在处于中断状态的线程中执行任何阻塞操作(例如read()
和write()
)将导致Channel
本身关闭,并引发java.nio.channels.ClosedByInterruptException
。AsynchronousFileChannel
可能是一个可行的替代方案。