1

语境:

我做了很多阅读,但只发现是半相关的。

我有一个 servlet,它调用另一个 Java 类的方法,同时传递会话敏感数据。它在 Tomcat 服务器上运行。

它看起来像这样:

@WebServlet(urlPatterns = {"/MyServlet", "/"})
public class MyServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException{ 
        HttpSession session = request.getSession(true); //Start a session
        String UserID = session.getId();                //Get a unique user ID
        MyClass cls = new MyClass();                    //Initialize my class
        String shortID = cls.newID(UserID);         //Call a method from class
        System.out.println("Your short ID is: " + shortID); //Print the result
    }
}

并说我正在调用的课程如下所示:

public class MyClass {

    public String newID(String UserID){
        String shortID;
            ... //Method for shortening the UserID
            return(shortID);
    }
}

当然,该方法需要比这个简单示例中显示的更多的处理。

问题一:

现在,我目前的理解是,当n 个用户同时调用MyServlet时,Tomcat 会在doGet方法中创建n 个线程。因此,当方法newID被同步调用时,Tomcat 会将线程排队并允许它们一个接一个地执行。它是否正确?

问题2:

当我有大量用户时会出现问题,因为第n个用户将不得不等待newID方法完成n-1次,这可能需要一段时间。因此,我将要异步调用newID方法,以便并行运行n 个线程,从而提高吞吐量。

我怎样才能做到这一点?

您会建议使用反射,还是将newID方法包装在Runnable中?

Tomcat 是否负责ExecutorService,还是我也需要实现它?

任何帮助都感激不尽。示例代码也会很有用!


4

1 回答 1

1

问题一:

Servlet 容器保留一个线程池,用于处理请求。它还保留您的 servlet 类的单个实例。当一个请求进来时,它会分派那些最终到达相应doXXX方法的线程之一。线程并没有真正排队。它们并行工作。所以同时进来的请求会被并行处理(在一定程度上,请阅读这里

问题2:

假设您已将 servlet 容器配置为拥有一个由 10 个线程组成的池来处理请求。但是在某些时候,您会收到 15 个请求。那么是的,5 个请求将排队等待可用的线程。在这种情况下,您可以使用 Servlet 3.0 异步支持(read1read2)在单独的线程(容器也管理)中处理请求。处理完成后,将重新调度池线程以完成请求处理。

阅读本文以获取有关如何管理线程的信息。

于 2013-08-28T13:49:54.907 回答