java - Tomcat 中的线程池和请求处理

标签 java multithreading tomcat concurrency 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;
 }
}

这是我在此处说明的非常基本的功能。

我有部署它的 tomcat 服务器。我听说 Tomcat 有一个线程池,大小为 200(默认)。现在我的问题是,这里的线程池究竟是如何工作的。

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

public class myThread extends Thread(){
    public void run(){
    //do whatever you wan to do here;
    }
}

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

现在,回到 Tomcat,是否有某个地方编写了一个 run() 方法来实例化 Services 类,这就是线程池处理 200 个并发请求的方式。 (显然,我知道他们需要 200 个内核才能同时执行,所以请忽略它)。

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

谢谢

最佳答案

Tomcat 的线程池的工作方式,或多或少与您从 ExecutorService 中获得的一样。 (参见 Executors)。

YMMV。 Tomcat 监听请求。当它收到请求时,它会将此请求放入队列中。同时,它维护 X 个线程,这些线程将不断尝试从该队列中获取数据。他们将准备ServletRequestServletResponse对象,以及 FilterChain和适当Servlet调用。

在伪代码中,这看起来像

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.
    }
}

确定合适的 ServletFilter实例取决于请求中的 URL 路径和您配置的 url 映射。 Tomcat(和每个 Servlet 容器)只会管理 Servlet 的单个实例或 Filter对于每个声明 <servlet><filter>部署描述符中的声明。

因此,每个线程都可能执行 service(..)相同的方法Servlet实例。

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


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

关于java - Tomcat 中的线程池和请求处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25970123/

相关文章:

java - 基本 Java : Error: Class, 接口(interface),或预期枚举

java - 转义序列无效(有效的是\b\t\n\f\r\"\'\\)

.net - 不可能(我讨厌使用这个词)交叉线程错误?

c++ - 为什么 std::thread 在被要求运行重载函数时会抛出错误?

java - java在线mp3处理

maven - Soap spring boot wsdl 生成的应用程序失败,显示 404 无可用消息

java - Tomcat 7.0.50 启动时属性的值部分中的无效字符 ':'

java - 广度优先搜索的深度

java - 捕获所有异常并返回带有消息列表的异常

python - 在 x 秒后运行某些代码,在 python 中每 n 秒运行一次