有什么方法可以在Java中执行异步IO而不阻塞任何线程(包括后台线程)吗?来自C#,我对异步IO的理解是,当您调用
await ReadAsync()
调用线程(线程池的一部分)进入ReadAsync
函数,有时从OS内核调用异步读取函数,然后将其自身添加回线程池以拾取其他{{1 }}。读取完成后,将通知线程池,另一个线程将拾取Tasks
的其余部分。
另一方面,在Java中,documentation和this的回答似乎表明异步IO函数只是由后台线程调用,然后又被阻塞了。这似乎表现不佳。有什么方法可以在Java中实现真正的非阻塞IO?
答案 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
的实现。