为什么要使用Java的AsynchronousFileChannel?

Joe*_*ell 15 java nio

我可以理解为什么网络应用会使用多路复用(不创建太多线程),以及为什么程序会使用异步调用进行流水线操作(更高效).但我不明白AsynchronousFileChannel的效率目的.

有任何想法吗?

Jes*_*per 8

它是一个可以用来异步读取文件的通道,即I/O操作是在一个单独的线程上完成的,这样你调用它的线程可以在I/O操作发生时做其他事情.

例如:read()类的方法返回一个Future对象以获取从文件中读取数据的结果.所以,你可以做的是调用read(),它将立即返回一个Future对象.在后台,另一个线程将从文件中读取实际数据.您自己的线程可以继续执行操作,当需要读取数据时,您可以调用get()Future对象.然后,这将返回数据(如果后台线程尚未完成读取数据,它将使您的线程阻塞,直到数据准备好).这样做的好处是你的线程不必等待读取操作的整个长度; 在真正需要数据之前,它可以做其他一些事情.

请参阅文档.

请注意,这AsynchronousFileChannel将是Java SE 7中的一个新类,尚未发布.

  • 这样做的好处是你*不需要两个线程.如果您正在编写大量数据,则在低级别,磁盘控制器会执行将数据写入磁盘的工作,然后发出中断信号,从而调用堆栈以调用完成处理程序.你的线程在这个过程中不需要阻塞,可以做其他事情.您使用少一个线程,线程调度程序管理一个较少的线程,您不需要使用java notify.基本上,您利用较少的资源来做同样的事情. (9认同)
  • 谢谢,但我想更多地了解效率原因——我不明白为什么在另一个线程中执行 I/O 有帮助。一个线程始终必须阻塞 I/O,并且没有报告资源重用、硬件功能利用率或任何其他性能增强行为。 (2认同)
  • 操作系统还可以优化执行异步IO操作的顺序.例如,如果您对文件中的各种区域进行大量异步读取操作,则操作系统可以将它们组合在一起进行顺序读取,而不必担心按照给定的精确顺序执行所有操作. (2认同)