Java中的非阻塞异步IO

时间:2020-04-26 15:55:02

标签: java asynchronous io

有什么方法可以在Java中执行异步IO而不阻塞任何线程(包括后台线程)吗?来自C#,我对异步IO的理解是,当您调用

await ReadAsync()

调用线程(线程池的一部分)进入ReadAsync函数,有时从OS内核调用异步读取函数,然后将其自身添加回线程池以拾取其他{{1 }}。读取完成后,将通知线程池,另一个线程将拾取Tasks的其余部分。

另一方面,在Java中,documentationthis的回答似乎表明异步IO函数只是由后台线程调用,然后又被阻塞了。这似乎表现不佳。有什么方法可以在Java中实现真正的非阻塞IO?

1 个答案:

答案 0 :(得分:1)

AsynchronousFileChannel.open()根据运行环境返回不同实现的实例。在Windows上,它应该返回WindowsAsynchronousFileChannelImpl的实例,该实例使用I / O完成端口并避免阻塞IO操作上的线程。线程池中的线程仅用于分配结果,不会阻塞,除非最终用户程序员阻塞了该线程。

RxIo建立在AFC之上,并提供与同步Files类等效的AsyncFiles,但具有异步API。利用CompletableFuture(相当于.net Task)的连续传递样式,您可以读取文件内容而不会阻塞:

AsyncFiles
  .readAll(path)
  .thenAccept(body ->     /* invoked on completion */)
  .exceptionally(excep -> /* invoked on error*/

您可以运行RxIo的单元测试,并在open()处放置一个断点,并检查WindowsAsynchronousFileChannelImpl的实现。