理解Java的非阻塞I / O.

时间:2012-01-08 13:02:23

标签: java nio

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

我也遇到过文章说线程应该自然阻塞,这样它就有机会运行其他线程。但是,在上述情况下不会发生这种情况,因为这些线程不会阻塞。

那么非阻塞IO如何有效?怎么理解这一切?一些多核CPU的角度或许呢?但是如何?

编辑:发现了一个非常好的链接,以编程方式解释它:

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

2 个答案:

答案 0 :(得分:3)

当您想要扩展服务器程序时,会启动使用阻止IO的问题。你必须持有一个阻塞线程每个请求。许多请求会引入很多线程。这可能会给服务器应用程序带来一些困难,因为服务器应用程序服务于数千个以上涉及并发请求的IO。

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

答案 1 :(得分:2)

除非您想使用忙等待(听起来不太可能),否则您通常使用少量线程(可能只有一个)和一个选择器。

如果要使用阻塞IO,那就是每个连接专用一个或两个线程时。