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

标签 java multithreading tomcat servlets asynchronous

我有一个 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/

相关文章:

java - 为什么缓存使用最近使用(MRU)算法作为驱逐策略?

java - NoClassDefFoundError : org. slf4j.LoggerFactory 是一个受限类

python - 处理 FIFO 队列,但如果项目太旧则将其丢弃

android - 何时关闭 Sqlite 数据库

c# - 不是每一个 IProgress<int> 的结果都从任务中出来

spring - 如果我创建一个 Spring 数据源,我还需要在 Tomcat context.xml 中定义数据源吗?

tomcat-maven-plugin 使用 Tomcat 7 - tomcat :deploy works, tomcat:undeploy 不

Tomcat 9 上下文 docBase 重定向到 https

Java 远程客户端 GUI

java - Android:对 EditText 中的字母进行排序