Java中的非阻塞异步IO

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中的非阻塞异步IO相关的知识,希望对你有一定的参考价值。

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

await ReadAsync()

调用线程(线程池的一部分)进入ReadAsync函数,在某些时候从OS内核调用异步读取函数,然后将自身添加回线程池以获取其他Tasks。读取完成后,将通知线程池,并由另一个线程拾取Task的其余部分。

另一方面,在[Java中,documentationthis答案似乎表明异步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的主要内容,如果未能解决你的问题,请参考以下文章

非阻塞 IO 与异步 IO 以及 Java 中的实现

C++ 的非线程异步 IO 简介?

并发并行串行同步异步阻塞非阻塞

Java异步非阻塞IO NIO使用与代码分析

netty为什么非阻塞

异步通道上的非阻塞接收?