在servlet中启动线程,可能是什么问题?

Anu*_*nav 1 java multithreading tomcat asynchronous servlets

我有一个Web应用程序,在单个请求上可能需要加载数百个数据.现在的问题是数据分散了.所以,我必须从几个地方加载数据,对它们应用过滤器,处理它们然后响应.顺序执行所有这些操作会使servlet 变慢!

所以我想到将所有数据加载到不同的线程中,比如t[i] = new Thread(loadData).start();等待所有线程完成使用while(i < count) t[i].join();,完成后,加入数据并做出响应.

现在我不确定这种方法是否正确或是否有更好的方法.我在某处读过,不建议在servlet中生成线程.

我想要的代码看起来像这样.

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
{
       Iterable<?> requireddata = requiredData(request);
       Thread[] t = new Thread[requireddata.size];
       int i = 0;
       while (requireddata.hasNext())
       {
             t[i]  = new Thread(new loadData(requiredata.next())).start();
             i++;
       }
       for(i = 0 ; i < t.length ; i++)
         t[i].join();
       // after getting the data process and respond!
}
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 6

主要问题是,如果许多并发请求进入servlet,您将使服务器瘫痪,因为您没有限制可以生成的线程数.另一个问题是你不断创建新线程而不是重用它们,这是低效的.

使用线程池可以轻松解决这两个问题.Java对它们有本机支持.阅读教程.

此外,确保在关闭webapp时使用ServletContextListener关闭线程池.