Tomcat中的多线程 - 创建线程池

时间:2016-02-10 21:01:23

标签: java multithreading tomcat servlets

我有一个servlet,用于一个需要几分钟才能完成的漫长过程。收到对此servlet的请求后,在线程内执行长进程,以便由于超时问题立即将响应发送回客户端:

public class TestServlet extends HttpServlet {

    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        //Thread safe code
        Thread thread = new Thread() {
            public void run() {
                try {
                    Thread.sleep(10000); //simulate long processing
                } catch(InterruptedException v) {
                }
            }  
        };

        thread.start();
    }

}

这意味着每次收到请求时,都会创建一个新线程。为了不遭受攻击的风险,我需要控制允许的线程数。这意味着在上下文中有一个池,并且如果所有线程都忙,则实现快速失败。

我正在查看Executor界面。我的问题是,我如何实现这个线程池执行器可以从收到的所有请求中访问,并充当所有线程的队列?我是否应该将执行程序声明为servlet中的本地非线程安全变量,以便该servlet的所有实例都可以访问,如下所示?

public class TestServlet extends HttpServlet {

    //non-thread safe variables
    //declare executor here

    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
    {
        //instantiate executor in case it is null

        Thread thread = new Thread() {
            public void run() {
                try {
                    Thread.sleep(10000); //simulate long processing
                } catch(InterruptedException v) {
                }
            }  
        };

        //add thread to the executor
    }
}

或者是否可以在上下文级别声明此执行程序?

我也在查看Tomcat Executor,我相信Tomcat本身会用它来管理它的线程。是否也可以将这些线程添加到此执行程序中?

1 个答案:

答案 0 :(得分:0)

通常在应用服务器中进行显式线程管理是个坏主意。您可以将servlet设置为在新线程中运行,从而避免将内容转移到servlet中的另一个线程。我还没有查看Tomcat是否允许您配置允许的servlet的最大并发实例数,因此这可能仍然是一个问题。

如果您明确使用了' Thread.sleep()',请不要放弃“InterruptedException”'像那样。这是错误的做法。查找正确的东西(处理和重新中断)。