假设我正在运行一个服务器,并将我接受的客户端 SocketChannel 设置为非阻塞,并通过线程池的线程读取它们。但这能给我带来什么?无论如何,我需要在处理之前读取完整的客户端请求,这意味着我需要进行多次读取调用。
我还遇到过一些文章,说线程应该自然阻塞,以便为其他线程提供运行的机会。但是,在上述情况下不会发生这种情况,因为这些线程不会阻塞。
那么非阻塞 IO 怎样才能高效呢?如何理解这一切?也许有一些多核CPU的角度?但如何呢?
编辑:找到一个非常好的链接,以编程方式解释它:
最佳答案
当您想要扩展服务器程序时,使用阻塞 IO 就会出现问题。您必须为每个请求保留一个阻塞线程。许多请求将引入许多线程。对于服务于数千个甚至更多涉及并发请求的 IO 的服务器应用程序来说,这可能会造成一些困难。
使用nio非阻塞IO,这种请求到线程的耦合是多余的。可以使用任意线程完成任意请求的IO操作。这使您可以为 IO 处理线程使用出色的池化模式,并显着减少线程创建和管理开销。另一方面,您必须更加努力地维持数据一致性,但这就是可扩展性的代价。
关于java - 理解 Java 的非阻塞 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8777743/