java - 理解 Java 的非阻塞 I/O

标签 java nio

假设我正在运行一个服务器,并将我接受的客户端 SocketChannel 设置为非阻塞,并通过线程池的线程读取它们。但这能给我带来什么?无论如何,我需要在处理之前读取完整的客户端请求,这意味着我需要进行多次读取调用。

我还遇到过一些文章,说线程应该自然阻塞,以便为其他线程提供运行的机会。但是,在上述情况下不会发生这种情况,因为这些线程不会阻塞。

那么非阻塞 IO 怎样才能高效呢?如何理解这一切?也许有一些多核CPU的角度?但如何呢?

编辑:找到一个非常好的链接,以编程方式解释它:

http://rox-xmlrpc.sourceforge.net/niotut/

最佳答案

当您想要扩展服务器程序时,使用阻塞 IO 就会出现问题。您必须为每个请求保留一个阻塞线程。许多请求将引入许多线程。对于服务于数千个甚至更多涉及并发请求的 IO 的服务器应用程序来说,这可能会造成一些困难。

使用nio非阻塞IO,这种请求到线程的耦合是多余的。可以使用任意线程完成任意请求的IO操作。这使您可以为 IO 处理线程使用出色的池化模式,并显着减少线程创建和管理开销。另一方面,您必须更加努力地维持数据一致性,但这就是可扩展性的代价。

关于java - 理解 Java 的非阻塞 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8777743/

相关文章:

java - 用于查找多个\n 并仅替换为一个 <br/> 的正则表达式

java - Ubuntu 上 Java 7 的原子文件移动问题

java - Files.walkFileTree 在 walk/proc 时在访问者方法之外抛出异常

java - Files.walk 跳过目录

java - 在 Java 中将输入流转换为数组的最佳方法是什么?

java - Android Studio - 录音问题 - Java新手

java - 如何删除JavaFX工具栏中分隔符后的多余空格?

java - 获取下一个未使用的ID?

java - 我可以同时写入和读取 SocketChannel 吗?

apache - org.apache.coyote.ajp.AjpMessage.processHeader 收到带有签名 18245 的无效消息