Tomcat中的线程池和请求处理

Kra*_*ken 3 java concurrency multithreading tomcat threadpool

好了,我已经问了一个与此有关的问题,但是需要更多信息。我会尽量与我的问题保持一致。(因为我不确定这些概念)。

背景

我有一个Java Web项目(动态)。我正在编写Restful Web服务。以下是我班的摘录

/services
class Services{
 static DataSource ds;
 static{
 ds = createNewDataSource;
 }

 /serviceFirst
 @Consumes(Something)
 @produces(Something)
 public List<Data> doFirst(){
  Connection con = ds.getConnection();
  ResultSet res = con.execute(preparedStatement);
  //iterate over res, and create list of Data.
  return list;
 }
}
Run Code Online (Sandbox Code Playgroud)

这是我在这里所说的非常基本的功能。

我已经在其中部署了tomcat服务器。我听说Tomcat的线程池大小为200(默认情况下)。现在我的问题是,线程池在这里到底是如何工作的。

假设我同时有两个请求。这意味着线程池中的两个线程将开始工作。这是否意味着两个线程都将具有我的类Services的实例?因为下面是我对线程和并发的理解。

public class myThread extends Thread(){
    public void run(){
    //do whatever you wan to do here;
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,当我在Thread上调用start时,它将在run()方法中执行代码,并且在其中创建的所有对象都将属于该对象。

现在,回到Tomcat,在某处run()编写了一个实例化Services类的方法,这就是线程池处理200个并发请求的方式。(很明显,我要使它们并发执行需要200个内核,因此请忽略它)。

因为否则,如果tomcat没有200个具有相同执行路径的不同线程(即,我的Services类),那么它将如何精确地处理200个并发请求。

谢谢

Sot*_*lis 5

Tomcat的线程池或多或少地起作用,就像您从线程池中得到的一样ExecutorService(请参阅参考资料Executors)。

YMMV。Tomcat侦听请求。收到请求后,它将请求放入队列。并行地,它维护X个线程,这些线程将连续尝试从此队列中获取。他们将准备ServletRequestServletResponse对象,以及FilterChainServlet进行调用。

用伪代码,这看起来像

public void run() {
    while (true) {
        socket = queue.take();
        ServletRequest request = getRequest(socket.getInputStream());
        ServletResponse response = generateResponse(socket.getOutputStream());
        Servlet servletInstance = determineServletInstance(request);
        FilterChain chain = determineFilterChainWithServlet(request, servletInstance);
        chain.doFilter(request,response); // down the line invokes the servlet#service method
        // do some cleanup, close streams, etc.
    }
}
Run Code Online (Sandbox Code Playgroud)

确定适当的ServletFilter实例取决于在请求中,你已经配置了网址的映射的URL路径。Tomcat的(和每一个Servlet容器)将只管理的单个实例ServletFilter每个申报<servlet><filter>申报中的部署描述符。

这样,每个线程都可能service(..)在同一Servlet实例上执行该方法。

这就是Servlet规范和Servlet API以及Tomcat所保证的。


至于您的Restful Web服务,请阅读。它描述了资源通常如何成为应用程序范围内的单例,类似于ServletServlet容器管理的实例。也就是说,每个线程都使用相同的实例来处理请求。