java - Tomcat 为每个 HTTP 请求分配一个新线程,那么使用 future.get() 的动机是什么?

标签 java tomcat server future callable

我知道 tomcat 服务器容器,为每个新的 HTTP 请求分配一个新线程。那么使用 callable + future 背后的动机是什么?

1) 为什么我们关心当前请求的唯一线程是否在执行长任务?

2) 如果主线程被 future.get() 阻塞,那么让它做长任务有什么好处呢?是关于 tomcat 识别线程空闲 + 阻塞 - 所以它知道不引发“超时”标志?

3) 使用 while(future.isDone()) 比仅仅被 future.get() 阻塞有什么优势?这个线程在忙等待的时候不能做其他事情。

最佳答案

每个线程占用一个堆栈大小(预分配,请参阅 -Xss),过多的线程可能会耗尽内存。将线程返回到 servlet 容器并使用 servlet api 3.1 的异步功能可能会更好。否则,卡在 future.get() 中没有任何好处,除非您为这个 future 运行任务的执行服务需要并发线程少于并发请求。例如:800 个 servlet 连接等待一个只有 50 个线程的 SQL 查询执行 svc。它也可能与安全/授权有关,当只允许来自特定执行程序 svc 的线程执行一些敏感调用时(从具有特权的线程工厂创建的线程)。

关于java - Tomcat 为每个 HTTP 请求分配一个新线程,那么使用 future.get() 的动机是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57763615/

相关文章:

Java equals()方法—— 'semantics of equals in subclasses'如何判断getClass和instanceof的使用

tomcat - 如何使 tomcat 随着内核数量的增加而可扩展?

apache - 服务器不查找 www 或其他子域

php - 传入生产服务器的 `/t.php` GET 请求是什么?

server - bokeh 服务器,使用 key 生成 session ID

java - JOOQ PostgreSQL 连接导致 InvalidResultException

java - 如何使用反射获取参数类型?

java - 如何刷新 lwuit 表单?

tomcat - 如何在 grails 中指定可移植的 jndi 数据源查找

java - 在网站后端运行 java 应用程序