WEB开发网
开发学院软件开发Java Servlet API 和 NIO: 最终组合在一起 阅读

Servlet API 和 NIO: 最终组合在一起

 2009-11-08 00:00:00 来源:WEB开发网   
核心提示: 由于 JDK 1.4 中引入了 NIO,企业开发人员最终有了“单线程”模型的一个内置解决方案:多元 I/O 使得固定数量的线程可以服务不断增长的用户数量,Servlet API 和 NIO: 最终组合在一起(2),多路复用(Multiplexing)指的是通过一个载波来同

由于 JDK 1.4 中引入了 NIO,企业开发人员最终有了“单线程”模型的一个内置解决方案:多元 I/O 使得固定数量的线程可以服务不断增长的用户数量。

多路复用(Multiplexing)指的是通过一个载波来同时发送多个信号或流。当使用手机时,日常的多路复用例子就发生了。无线频率是稀有的资源,因此无线频率提供商使用多路复用技术通过一个频率发送多个呼叫。在一个例子中,把呼叫分成一些段,然后给这些段很短的持续时间,并在接收端重新装配。这就叫做 时分多路复用(time-division multiplexing),即 TDM。

在 NIO 中,接收端相当于“选择器”(参阅 java.nio.channels.Selector )。不是处理呼叫,选择器是处理多个打开的 socket。就像在 TDM 中那样,选择器重新装配从多个客户机写入的数据段。这使得服务器可以用单个线程管理多个客户机。

Servlet API 和 NIO

对于 NIO,非阻塞读写是必要的,但它们并不是完全没有麻烦。除了不会阻塞之外,非阻塞读不能给呼叫方任何保证。客户机或服务器应用程序可能读取完整信息、部分消息或者根本读取不到消息。另外,非阻塞读可能读取到太多的消息,从而强制为下一个呼叫准备一个额外的缓冲区。最后,不像流那样,读取了零字节并不表明已经完全接收了消息。

这些因素使得没有轮询就不可能实现甚至是简单的 readline 方法。所有的 servlet 容器必须在它们的输入流上提供 readline 方法。因此,许多开发人员放弃了创建基于 Servlet 并实现了 NIO 的 Web 应用程序服务器。不过这里有一个解决方案,它组合了 Servlet API 和 NIO 的多元 I/O 的能力。

在下面的几节中,您将学习如何使用 java.io.PipedInput 和 PipedOutputStream 类来把生产者/消费者模型应用到消费者非阻塞 I/O。当读取非阻塞通道时,把它写到正由第二个线程消费的管道。注意,这种分解映射线程不同于大多数基于 Java 的客户机/服务器应用程序。这里,我们让一个线程单独负责处理非阻塞通道(生产者),让另一个线程单独负责把数据作为流消费(消费者)。管道也为应用程序服务器解决了非阻塞 I/O 问题,因为 servlet 在消费 I/O 时将采用阻塞语义。

上一页  1 2 3 4 5 6 7  下一页

Tags:Servlet API NIO

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接