我有一个 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!
}
最佳答案
主要问题是,如果许多并发请求进入您的 servlet,您将使服务器崩溃,因为您没有限制可以产生的线程数。另一个问题是您不断创建新线程而不是重复使用它们,这是低效的。
这两个问题使用线程池就很容易解决了。 Java 对它们有原生支持。阅读the tutorial .
此外,确保在关闭 webapp 时使用 ServletContextListener 关闭线程池。
关于java - 在 servlet 中启动线程,可能是什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14787320/