Java中的非阻塞异步IO
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的非阻塞异步IO相关的知识,希望对你有一定的参考价值。
是否有任何方法可以在Java中执行异步IO而又不阻塞任何线程(包括后台线程)?来自C#,我对异步IO的理解是,当您调用
时await ReadAsync()
调用线程(线程池的一部分)进入ReadAsync
函数,在某些时候从OS内核调用异步读取函数,然后将自身添加回线程池以获取其他Tasks
。读取完成后,将通知线程池,并由另一个线程拾取Task
的其余部分。
另一方面,在[Java中,documentation和this答案似乎表明异步IO函数只是由后台线程调用,然后又被阻塞了。这似乎表现不佳。有什么方法可以用Java实现真正的非阻塞IO?
AsynchronousFileChannel.open()
根据运行环境返回不同实现的实例。在Windows上,它应该返回WindowsAsynchronousFileChannelImpl
的实例,该实例使用I / O完成端口并避免阻塞IO操作上的线程。除非最终用户程序员阻止该线程,否则线程池的线程仅用于分配结果,而不阻塞。
RxIo建立在AFC之上,并提供与同步AsyncFiles
类等效的AsyncFiles
,但具有异步API。利用Files
的连续传递样式(等效于.net CompletableFuture
),您可以读取文件内容而不会阻塞:
Task
您可以运行AsyncFiles
.readAll(path)
.thenAccept(body -> /* invoked on completion */)
.exceptionally(excep -> /* invoked on error*/
的单元测试,并在RxIo处放置一个断点,并检查open()的实现。
以上是关于Java中的非阻塞异步IO的主要内容,如果未能解决你的问题,请参考以下文章