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

Java Tomcat为每个HTTP请求分配一个新线程,那么';使用future.get()的动机是什么?,java,tomcat,server,future,callable,Java,Tomcat,Server,Future,Callable,我知道tomcat服务器容器,为每个新的HTTP请求分配一个新线程。那么使用callable+future的动机是什么 1) 为什么我们关心当前请求的唯一线程是否正在执行长任务 2) 如果主线程被future.get()阻塞,那么让它做长时间的任务有什么好处呢?是因为tomcat意识到线程处于空闲+阻塞状态,所以它知道不需要发出“超时”标志吗 3) 使用while(future.isDone())比被future.get()阻塞有什么好处?这不像这个线程在忙着等待时可以做其他事情。每个线程占用一

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

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

2) 如果主线程被future.get()阻塞,那么让它做长时间的任务有什么好处呢?是因为tomcat意识到线程处于空闲+阻塞状态,所以它知道不需要发出“超时”标志吗


3) 使用while(future.isDone())比被future.get()阻塞有什么好处?这不像这个线程在忙着等待时可以做其他事情。

每个线程占用一个堆栈大小(预分配,请参阅-Xss),太多线程可能会耗尽内存。最好将线程返回到servlet容器并使用ServletAPI3.1的异步功能。否则,挂起future.get()没有任何好处,除非运行此future任务的执行服务要求并发线程少于并发请求。例如:800个servlet连接等待一个只有50个线程的SQL查询执行svc。它还可能涉及安全性/授权,当只允许特定执行器svc的线程执行某些敏感调用(从具有权限的线程工厂创建的线程)时。

一般来说,在Servlet容器的请求处理线程中使用a不是一个有用的工具。如果您想改进web服务器对长时间运行的请求的处理,您应该使用Servlet容器的异步处理功能,而不是
未来的
。不,您不知道。(1) Tomcat使用一个线程池,所以它并不总是一个新线程,(2)多个请求可以通过一个连接进入,所以它也不是每个连接都有一个线程,不管是新的还是旧的。你能给出一个代码示例来说明你的问题吗?在web应用程序中,有些地方使用
Future
是有意义的,但在循环中调用
Future.isDone()
显然是错误的。