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

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

 2009-11-08 00:00:00 来源:WEB开发网   
核心提示: ServerEventHandler 类ServerEventHandler 类响应服务器事件,当新客户机变为可用时,Servlet API 和 NIO: 最终组合在一起(4),它就实例化一个新的 Client 对象,该对象代表了那个客户机的状态,如果请求通过资源或处理需求花了很长时间,那么通过

ServerEventHandler 类

ServerEventHandler 类响应服务器事件。当新客户机变为可用时,它就实例化一个新的 Client 对象,该对象代表了那个客户机的状态。数据是以非阻塞方式从通道中读取的,并被写到 Client 对象中。 ServerEventHandler 对象也维护请求队列。为了处理(消费)队列中的请求,生成了不定数量的工作线程。在传统的生产者/消费者方式下,为了在队列变为空时线程会阻塞,并在新请求可用时线程会得到通知,需要写 Queue 。

为了支持等待的线程,在清单 2 中已经重写了 remove() 方法。如果列表为空,就会增加等待线程的数量,并阻塞当前线程。它实质上提供了非常简单的线程池。


清单 2. Queue.java
public class Queue extends LinkedList 
{ 
 private int waitingThreads = 0; 
 public synchronized void insert(Object obj) 
 { 
 addLast(obj); 
 notify(); 
 } 
 public synchronized Object remove() 
 { 
 if ( isEmpty() ) { 
  try { waitingThreads++; wait();} 
  catch (InterruptedException e) {Thread.interrupted();} 
  waitingThreads--; 
 } 
 return removeFirst(); 
 } 
 public boolean isEmpty() { 
 return (size() - waitingThreads <= 0); 
 } 
} 

工作线程的数量与 Web 客户机的数量无关。不是为每个打开的 socket 分配一个线程,相反,我们把所有请求放到一个由一组 RequestHandlerThread 实例所服务的通用队列中。理想情况下,线程的数量应该根据处理器的数量和请求的长度或持续时间进行调整。如果请求通过资源或处理需求花了很长时间,那么通过添加更多的线程,可以提高感知到的服务质量。

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

Tags:Servlet API NIO

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